CentOS7 自动化运维基础 符号与正则表达式

2/17/2020 linuxBash

# Shell引号

# 反斜线

  • 反斜线将将紧跟其后的单个字符设为字面意义上的字符
  • 如果在命令末尾使用\回车后,\可以将回车命令提交功能屏蔽,将回车认为是换行继续输入命令,实现命令的多行输入
[root@Hyui-VM ~]# echo *  #显示当前目录所有文件
file1 file2 file3 test.sh
[root@Hyui-VM ~]# echo \*  #显示字符*
*
[root@Hyui-VM ~]# echo \>
>
[root@Hyui-VM ~]# find / \  #换行输入多行命令
> -name "test.sh" \
> -type f \
> -size +5M

# 单引号

  • 单引号将所有字符还原为字面意义,实现屏蔽Shell元字符的功能
  • 单引号必须成对出现
[root@Hyui-VM ~]# echo '$HOME'  #单引号屏蔽了$的功能
$HOME
[root@Hyui-VM ~]# echo 'test\'  #单引号屏蔽了\功能
test\

# 双引号

  • 双引号不会屏蔽'和\和$这三个Shell元字符的含义
  • 如果需要屏蔽这些字符含义,必须前置添加一个\符号
[root@Hyui-VM ~]# echo "This's CentOS7"  #双引号中的单引号可以单个出现
This's CentOS7
[root@Hyui-VM ~]# echo "$HOME"  #正常输出$HOME路径
/root
[root@Hyui-VM ~]# echo "\$HOME"  #$符号被屏蔽
$HOME

# 反引号

  • Shell中使用反引号进行命令替换,命令替换可以使Shell将命令字符替换为命令执行结果的输出内容,同样功能也可以使用$()来实现
[root@Hyui-VM ~]# echo "Today is $(date +%D)"  
Today is 02/17/20

# 正则表达式

  • 系统常用编辑工具与正则表达式的对应关系
编辑工具 基本正则表达式 扩展正则表达式
grep X
egrep
vi X
sed X
awk

# 基本正则表达式

# 基本正则表达式含义

符号 含义
c 匹配字母c
. 匹配任意单个字符
* 匹配前一个字符出现零次或多次
.* 匹配任意多个任意字符
[] 匹配集合中的任意单个字符,括号中为一个集合
[x-y] 匹配连续的字串范围
^ 匹配字符串的开头
$ 匹配字串的结尾
[^] 匹配否定,对括号中的集合取反
|匹配转义后的字串
{n,m} 匹配前一个字符重复n到m次
{n,} 匹配前一个字符重复至少n次
{n} 匹配前一个字符n次
() 将(与)之间的内容存储在“保留空间”,最大存储9个
\n 通过\1至\9调用保留空间中的内容

# 基本正则表达式案例

[root@Hyui-VM ~]# cp /etc/passwd ./
[root@Hyui-VM ~]# grep root ./passwd  #查找passwd文件中包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@Hyui-VM ~]# grep --color :..0: ./passwd  #查找:与0之间包含任意两个字符的字串,并用颜色加亮显示该行
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
games:x:12:100:games:/usr/games:/sbin/nologin

[root@Hyui-VM ~]# grep --color 00* ./passwd  #查找包含至少一个0的行
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@Hyui-VM ~]# grep --color o[os]t ./passwd  #查找包含oot或ost的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

[root@Hyui-VM ~]# grep --color [0-9] ./passwd  #查找包含数字0~9的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

[root@Hyui-VM ~]# grep --color [f-q] ./passwd  #查找包含字母f~q的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

[root@Hyui-VM ~]# grep --color ^root ./passwd  #查找开头为root的行
root:x:0:0:root:/root:/bin/bash

[root@Hyui-VM ~]# grep --color bash$ ./passwd  #查找以bash结尾的行
root:x:0:0:root:/root:/bin/bash

[root@Hyui-VM ~]# grep --color sbin/[^n] ./passwd  #查找sbin/后不跟n的行
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

[root@Hyui-VM ~]# grep --color '0\{1,2\}' ./passwd  #查找数字0出现一次两次的行
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@Hyui-VM ~]# grep --color "\(root\).*\1" ./passwd  #查找包含两个root的行
root:x:0:0:root:/root:/bin/bash

[root@Hyui-VM ~]# grep --color "\(root\)\(:\).*\2\1" ./passwd  #查找以root:开头并以:root结尾的字串行
root:x:0:0:root:/root:/bin/bash

[root@Hyui-VM ~]# grep ^$ ./passwd  #过滤文件的空白行
[root@Hyui-VM ~]# grep -v ^$ ./passwd  #过滤文件的非空白行

# 扩展正则表达式

  • 扩展正则表达式及含义
字 符 含 义
{n,m} 等同于基本正则表达式的{n,m}
+ 匹配前一个字符出现一次或多次
? 匹配前一个字符出现一次或零次
() 匹配正则集合
  • |是匹配逻辑或,即匹配|前后的字串
  • 扩展正则表达式案例
[root@Hyui-VM ~]# egrep --color '0{1,2}' ./passwd  #查询数字0出现1次或2次的行
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@Hyui-VM ~]# egrep --color '0+' ./passwd  #查找至少出现一个0的行
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@Hyui-VM ~]# egrep --color '(root|admin)' ./passwd  #查找包含root或admin的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# POSIX规范

  • 基本正则表达式会有语系问题,需要用POSIX规范正则表达式规则

# POSIX规范含义

字符集 含 义 字符集 含 义
[:alpha:] 字母字符 [:graph:] 非空格字符
[:alnum:] 字母与数字字符 [:print:] 任何可以显示的字符
[:cntrl:] 控制字符 [:space:] 任何产生空白的字符
[:digit:] 数字字符 [:black:] 空格与Tab键字符
[:xdigit:] 十六进制数字字符 [:lower:] 小写字符
[:punct:] 标点符号 [:upper:] 大写字符

# POSIX规范案例

[root@Hyui-VM ~]# grep --color [[:digit:]] ./passwd  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

[root@Hyui-VM ~]# grep --color [[:alpha:]] ./passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

[root@Hyui-VM ~]# grep --color [[:punct:]] ./passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

[root@Hyui-VM ~]# grep [[:space:]] ./passwd 
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

# GUN规范

  • Linux中的GUN软件一般还会支持转义元字符,转义元字符包括:\b(边界字符)、\B(与\b为反义词)
  • 例如 then, hello the world,字串每一个单词前后都有个\b,用\bthe\b匹配单词,但不会匹配then;\B相反,\Bthe\B不会匹配the,只会匹配the在中加的单词
[root@Hyui-VM ~]# grep --color "d\b" ./passwd  #匹配d结尾的单词
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

[root@Hyui-VM ~]# grep --color "\W" ./passwd  #匹配非单词字符
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
I will (Piano Ver.)
solfa