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

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

    正则表达式

  • 系统常用编辑工具与正则表达式的对应关系
    编辑工具基本正则表达式扩展正则表达式
    grepX
    egrep
    viX
    sedX
    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