shell_正则_变量_tr_awk_sed_cut(1)

2023-03-07 14:14:32 浏览数 (2)

文章目录
  • 正则表达式
    • 特殊字符含义
    • 匹配规则组合
    • ifconfig的用法
    • 执行脚本的几种方式(bash shell)
    • vim配置文件自动设置脚本文件头
    • 脚本调试
  • 变量
    • shell语言的特点
    • 强类型语言
    • 弱类型语言
    • 局部变量
    • 全局变量
    • 删除变量
    • 查看变量
  • 练习
    • 1.编写脚本/root/bin/systeminfo.sh, 显示当前主机系统信息,包括主机名,Ipv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
    • tr - ( c d s)
    • awk 文本处理工具
    • sed
    • sed实例
    • 以行为单位的新增/删除
    • 以行为单位的替换与显示
    • 数据的搜寻并显示/删除
    • 数据的搜寻并执行命令
    • 数据的搜寻并替换
    • 多点编辑
    • 直接修改文件内容
    • cut -(d f)
    • 2.编写脚本/root/bin/backup.sh,可以实现每日将/etc/目录备份到/root/rtcYYY-mm-dd中
    • cp
    • echo -e(颜色)
    • umask
    • ()小括号的作用
    • man bash

正则表达式

特殊字符含义
  • 匹配的字符在前
代码语言:javascript复制
. 匹配任意字符(汉字也行)
* 匹配任意0,1,2次数
	(wang)*  单词重复任意0,1,2次数
  重复一次以上
	x{n} 精确匹配n次,
    x{n,} 最少匹配n次
    x{n,m} 匹配n到m次
    x{,m}最多匹配m次
    
?匹配0,1次(非贪婪模式)
[1-9]?[0-9]  == (0~99)

^ 脱字符,匹配行首
$ 匹配行尾

< 或者 b :
以..首个字母或数字开始匹配(词首)
> 或者b :
以..为结尾匹配(词尾)
<   xxx  >:  锁定范围(单词绑定)

托字符放在[]外面表示匹配行首:
^ 脱字符,匹配行首
放在[]里面表示除了:
[^,] 除了...

[:alpha:] 匹配字母
[:alnum:] 匹配字母和数字
                 
a|b xy :a或b ,xy
(a|b)xy: axy或bxy
匹配规则组合

代码语言:javascript复制
(expr1第一次正则匹配)   (expr2第二次正则匹配)   1  (第一次匹配得到的结果)    2  (第二次匹配得到的结果)

vim中
	:%s /xyz/&er/g 
 在vim中将xyz逐行替换成xyzer
 
vim中几种常见的模式
命令模式: 
以vi打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用**删除字符或删除整行**来处理文件内容, 也可以使用复制、粘贴来处理你的文件数据。  

输入模式: 
在命令模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,只有当到你按下【i, I, o, O, a, A, r, R】等任何一个字母之后才会进入输入模式。这时候屏幕的左下方会出现【INSERT或 REPLACE】的字样,此时才可以进行编辑。而如果要回到命令模式时, 则必须要按下【Esc】即可退出编辑模式。  

底线命令行模式:

输入【 : / ? 】三个中的任何一个,就可以将光标移动到最底下那一行。在这个模式中, 可以提供查找、读取、存盘、替换字符、离开vi、显示行号等的动作则是在此模式中完成的!
ifconfig的用法
代码语言:javascript复制
ifconfig ens33 |grep -o
-o : 表示的只输出符合re规则的字符串
egrep=grep -E 用于显示文件中符合条件的字符串

一般使用:
ifconfig ens33 |egrep -o 

匹配ip地址及网卡?
192.168.1.7      :小网ip
255.255.255.0 :子网掩码
192.168.1.255 :广播地址

ip的形式: 
可能是:   10.x.x.x.
也可能是:100.x.x.x
也可能是:1.x.x.x.x
所以四个字段都可能是一位/两位/三位的数字

解析:其中有1,2,3位的数字
同全取左,和全取右,便得到范围表达。
[0-9]                      0-9 
[1-9][0-9]                 10-99
1[0-9][0-9]                100-199
2[0-4][0-9]                200-249
25[0-5]                    250-255


ifconfig wlp3s0|egrep -o "(([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5])"

([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5]).){3} : 表示ip的前三个数字段
.     转译点
{3}  匹配三次

注意:
echo 2192.168.30.102 | egrep -o "(([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5])"
egrep 显示匹配的内容
同样匹配显示:192.168.30.102
所以要在首尾添加<   和  >

优化为:
echo 2192.168.30.102 | egrep -o ">(([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5])>"
或:
ifconfig |egrep -o "b(([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5])b"
更加严谨

(0~99)其中[0-9]|[1-9][0-9]可以简化成[1-9]?[0-9]
执行脚本的几种方式(bash shell)
代码语言:javascript复制
1.按照绝对路径执行(执行前脚本必须要有执行权限 chmod  x xx.sh)
./xx.sh
2.bash 或 cat xx.sh|bash
3.将脚本放在	PATH环境变量对应的任意路径下直接运行(系统会直接在PATH的环境变量中找脚本)
注意 :
	echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
	将脚本直接放到PATH环境变量对应的目录下
	mv xx.sh /root/bin
	直接执行脚本
    xx.sh
    第一次执行就按照PATH中的路径查找,一但找到就把路径hash到内存中了
    >hash(查看)
    #   /root/bin/xx.sh

    若 mv /root/bin/hello.sh /usr/local/bin  将脚本移到新的PATH路径下
    hello.sh找不到脚本文件了
    hash -d hello.sh(脚本的名字) : 删除掉了上次hash存放的脚本地址
    hello.sh 再次执行就又hash到内存中了
cmd : command命令提示符

补充:Hash
	Hash,一般翻译做“散列”
    也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
vim配置文件自动设置脚本文件头
  • vim配置文件
  • .vimrc放在家目录下面(当前用户vim的配置文件)。
  • /etc/vim/vimrc : 系统全局vim配置文件。
  • case : 事实,具体情况
  • indent : 空格
  • 配置好vimrc文件不用source。
代码语言:javascript复制
#!/bin/bash
set nu
set ignorecase#(忽略大小写)
set cursorline#(设置光标行对齐)
set autoindent#(设置自动行对齐)
autocmd BufnewFile *.sh exec ":call SetTitle()"
func SetTitle()
    if &filetype=="sh"
    call setline(1,"#!/bin/bash")
    call setline(2,"#***************")
    call setline(3,"Author : xzw")
    call setline(4,"#Date: "  .strftime("%y-%m-%d"))
    call setline(5,"#***************")
    endif
endfunc

补充:
	1.&
    & 放在启动参数后面表示设置此进程为后台进程
默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。然后可以用ctrl   c键结束进程
	ctrl   c :linux中结束进程
    ctrl   z :linux中将进程挂起
    
    2.
脚本调试
代码语言:javascript复制
1.命令错误
hostnam   :命令继续向下执行
2.语法错误
syntax error :默认不会继续执行下去

脚本调试
bash -n file.sh 来检测脚本中的语法错误
bash -x file.sh 跟踪脚本中执行的命令
注意:
	echo $HOSTNAME
	显示的 表示执行的命令,
	echo `hostname`
	  表示的是嵌套的命令(两层)
变量
代码语言:javascript复制
引用变量加$与不加$
#能区分字符串的命令则不用加,
echo 默认打印的是字符串所以要加 $

系统自带的环境变量
PATH
HOME
UID
PWD
PS1

1.变量赋值

代码语言:javascript复制
name="Mage"  
等号两边无空格
name="wang"
注意:
	重新赋值变量,会重新开辟一个空间存放wang,不会立即删除Mage,删除也会消耗资源,标记等待回收,下次内容会覆盖

2.命令赋值

代码语言:javascript复制
name=`hostname`

3.变量内存放多行内容

代码语言:javascript复制
name=`cat /etc/fstab`
echo "$name"
加双引号可以保留原来多行内容的格式

4.变量引用变量

代码语言:javascript复制
name1="wang"
name2=name1

name1="li"

#>echo $name1
>li

#>echo $name2
>wang

name1重新赋值会重新开辟空间存放赋值内容,name2的原指向不变
shell语言的特点
代码语言:javascript复制
shell的变量类型不需要声明,不检查变量存放的数据类型
例如:
i=100
默认存放的是字符串
强类型语言

定义变量需要指定类型

Java c c#

弱类型语言

不需要指定数据的类型

python php bash

bash 不支持浮点数,只支持小数

命名规则

代码语言:javascript复制
StudentName : 大驼峰命名法
studentFirstName :小驼峰命名法(第一个单词的首字母不大写)
局部变量
代码语言:javascript复制
echo $$查看当前的进程编号
echo $PPID查看父进程的进程编号
pstree -p :查看进程树

bash 另开一个进程
exit 退出进程

父子进程间的变量不会相互影响,不可相互传递
全局变量
代码语言:javascript复制
export name="haha"
或者
declare -x name='haha'

全局变量中,子进程可以使用,修改父进程的变量,但是不会影响父进程的变量

HOSTNAME       主机名称
SHLVL          shell的嵌套深度
PATH           
				1.储存各种工具,命令的路径
    			2.当使用工具及命令(运行脚本)的时候,系统会去PATH中查找对应的工具及命令
        		3.若不想用绝对路径执行脚本,可以将脚本添加到PATH中(hash查看)
           
SHELL
USER            当前的用户
UID             用户的id
HOME            用户的家目录
PWD             用户的当前目录
LANG            当前使用的语言
MALL           
HISTSIZE

ls /bin/ /dev/ /etc/
ls可以同时显示多个目录
$_             上一个命令的最后一个参数
># echo $_ 
># /etc
删除变量
代码语言:javascript复制
unset   变量名
查看变量
代码语言:javascript复制
export 查看目前环境变量
env    查看系统自带的环境变量
set    显示最全的变量(全局、局部变量)
declare -x 
练习
1.编写脚本/root/bin/systeminfo.sh, 显示当前主机系统信息,包括主机名,Ipv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
代码语言:javascript复制
主机名 :           hostname
Ipv4地址 :        ifconfig ens33 | grep ""
操作系统版本:       cat /etc/centos-release
                  cat /etc/redhead
        
内核版本            uname -r
CPU型号            lscpu
内存大小            cat /proc/meminfo
硬盘大小            lsblk
查看分区            df -h
tr - ( c d s)
代码语言:javascript复制
tr - translate or delete characters 主要用于转换和删除字符

1.去除重复的字符
	tr -s "[a-z]"
    tr -s " " 去除重复的空格
    tr -s "[n]"
2.替换大小写
	tr "[a-z]" "[A-Z]"
3.删除
	tr -d "[0-9][:]" 删除所有数字及空格
awk 文本处理工具
代码语言:javascript复制
通过扫描文本的每一行,匹配符合规则的数据
-F        指定分隔符
$0        整行
$n        第n列
NF        当前行的列数
$NF       最后一列

{}            命令代码块,包含一条或多条命令,多条命令用 ;  隔开
sed
代码语言:javascript复制
利用脚本处理文本文件

参数说明
    ●-e<script> 或--expression=<script>    以选中指定的script来处理输入的文本文件。
 
    ●-f<script文件> 或 --file=<script文件>   以轩选项中指定的script文件来处理输入的文本文件。
 
    ●-n 或 —quite 或 —silent                  仅显示script处理后的结果。
 
    ●-V 或 —version                         显示版本信息


动作说明
    ●a : 新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)。: add
 
    ●c : 取代,c后面可以接字符串,这些字符串可以取代n1,n2之间的行。
 
    ●d : 删除,因为是删除,所以d后面通常不接任何参数。: delete
 
    ●i :插入,i后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)。: insert
 
    ●p : 打印,亦即将某个选择的数据印出。通常p会与参数sed –n一起运行。: print
 
    ●s : 取代,可以直接进行取代的工作,通常这个s的动作可以搭配正规表示法: substitute
sed实例
以行为单位的新增/删除
代码语言:javascript复制
<1>. 将/root/testfile的内容列出并且打印行号,同时,请将第2~5行删除!

     nl /root/testfile  | sed '2,5d'

<2>. 删除第3行到最后一行

    nl /root/testfile | sed '3,$d'

<3>. 在第二行前加入hello redhat

    nl /root/testfile | sed '2i hello redhat'

<4>. 增加两行以上,在第二行后面加入两行字

    nl /root/testfile  | sed '2a hello 
    > redhat'
以行为单位的替换与显示
代码语言:javascript复制
<1>. 将第2到5行的内容取代为No 2-5 hello 

    nl /root/testfile  | sed '2,5c No 2-5 hello'


<2>. 仅列出/root/testfile文件内容的第5—7行

    nl /root/testfile | sed -n '5,7p'
数据的搜寻并显示/删除
代码语言:javascript复制
<1>. 搜索/etc/passwd有关root关键字的行

    nl /etc/passwd | sed '/root/p'

    nl /etc/passwd | sed -n ' /root/p'
    -n 只将打印包含匹配行。



<2>. 删除/etc/passwd所有包含root的行,其进行输出

    nl /etc/passwd | sed '/root/d'
数据的搜寻并执行命令
代码语言:javascript复制
<1>. 搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

    nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'

    注:q:退出。
数据的搜寻并替换
代码语言:javascript复制
<1>. sed 's/要被取代的字符串/新的字符串/g'

    nl test.sh | sed 's/^/#/g'       : 脚本行首添加注释
    n1 test.sh | sed '1, 3s/^#/ /g'  : 脚本1-3行解注释
    
    注:
      ^ : 正则匹配行首
      $ : 正则匹配行尾
多点编辑
代码语言:javascript复制
<1>. -e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

    nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
直接修改文件内容
代码语言:javascript复制
<1>. /root/testfile内每一行结尾的 . 替换成 !

    sed -i 's/.$/!/g' testfile

<2>. 利用sed直接在/root/testfile文件中最后一行加入#hello redhat

    sed -i '$a #hello redhat' /root/testfile
cut -(d f)
代码语言:javascript复制
-d 指定字段分割符,默认为tab
-f 显示指定字段的内容

># echo "/home/lxy/hhhhh-a.bbb.cc.d" |awk -F/ '{print $NF}'| cut -d'.' -f2 
># bbb

cut -d"" -f2
2.编写脚本/root/bin/backup.sh,可以实现每日将/etc/目录备份到/root/rtcYYY-mm-dd中
cp
代码语言:javascript复制
-a                 
尽可能将源文件状态、权限等资料都照原装予以复制,并且是递归copy; 

-r
表示递归copy,若source中含有目录名,则将目录下之档案亦皆依序拷贝至目的地; 

-f 
若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制; 

-v
复制的时候显示详细信息
echo -e(颜色)
代码语言:javascript复制
支持控制字符

>#  echo -e "e[1;31m abed e[0m"

这条命令会把 abcd 按照红色输出。
e[1 是标准格式,代表颜色输出开始,
; 注意封号后面是颜色
e[0m 代表颜色输出结束,
31m 定义字体颜色是红色。

echo 命令能够识别的颜色如下:
   30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,	36m=青色,37m=白色。
umask
代码语言:javascript复制
用于设置用户在创建文件时的默认权限
root用户默认umask是0022 ,普通用户默认的是0002
drwxr-xr-x 
755

默认情况下,
目录,用户所能拥有的最大权限是777;
文件,用户所能拥有的最大权限是目录的最大权限去掉执行权限,即666。666-022若是得到奇数,再加一
目录:777-022=755
文件:666-022=644
777减去设置的umask的值得到的是当前设置的文件的权限

更改权限
umask 026

1.umask命令只能临时修改umask值,系统重启之后umask将还原成默认值。
2.如果要永久修改umask值,需要修改/etc/profile文件或是修改/etc/bashrc文件
3.例如要将默认umask值设置为027,那么可以在文件中增加一行“umask 027”。

---------------------------------------------------------------------------------
-rw-rw-r–这一字符串标识文件权限。

这个字符串有10位,可以分为4段来解读。
注:r可读,w可写,x可执行。
第一段(第1位)表示是目录还是文件,-表示是文件,d表示是目录;
第二段(第2-4位,共3个字符串)表示文件所属用户对它的权限;
第三段(第5-7位,共3个字符串)表示文件所属用户组用户对它的权限;
第四段(第8-10位,共3个字符串)表示其他用户对它的权限;

注:
我们用3位8进制来表示文件的权限,
4,2,1
r用4标识,2^2读
w用2标识,2^1写
x用1标识,2^0可执行
---------------------------------------------------------------------------------
()小括号的作用
代码语言:javascript复制
(umask 026;mkdir xzw_test_2)
1.用于一次性的任务,运行的时候会开启子进程,不影响父进程,不影响当前的进程的环境变量,运行完退出。
2.多个指令可以用;连接

>>>x=1;echo "pid=$$";(echo "subpid=$$";x=2;echo "subx2=$x");echo x=$x

>pid=2887
>subpid=2887
>ubx2=2
>x=1

注意:
	小括号和子shell还不太一样,是开启子进程但是()的进程和当前的进程id一样
man bash
代码语言:javascript复制
bash使用说明书

查询()介绍
:/(list)

0 人点赞