这篇文章上次修改于 604 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

Shell引号

反斜线

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

单引号

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

双引号

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

反引号

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

正则表达式

  • 系统常用编辑工具与正则表达式的对应关系
编辑工具基本正则表达式扩展正则表达式
grepX
egrep
viX
sedX
awk

基本正则表达式

基本正则表达式含义

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

基本正则表达式案例

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

[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# 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

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

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

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

[[email protected] ~]# 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

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

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

[[email protected] ~]# grep ^$ ./passwd  #过滤文件的空白行
[[email protected] ~]# grep -v ^$ ./passwd  #过滤文件的非空白行

扩展正则表达式

  • 扩展正则表达式及含义
    |字 符|含 义|
{n,m}等同于基本正则表达式的{n,m}
+匹配前一个字符出现一次或多次
?匹配前一个字符出现一次或零次
()匹配正则集合
  • |是匹配逻辑或,即匹配|前后的字串
  • 扩展正则表达式案例
[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# 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规范案例

[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# 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,用btheb匹配单词,但不会匹配then;B相反,BtheB不会匹配the,只会匹配the在中加的单词
[[email protected] ~]# 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

[[email protected] ~]# 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