通配符与正则表达式元字符的理解及grep的实例应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通配符与正则表达式元字符的理解及grep的实例应用相关的知识,希望对你有一定的参考价值。


什么是通配符(glob)?

    通配符是Linux shell中用来描述(匹配)不确定字符的特殊符号.

看看具体通配符是如何描述字符?

    *       代表任意字符任意次数
    ?       代表任意单个字符0次或者1次
    []      代表括号中存在的任意单个字符
    [!]     代表非括号中存在的任意单个字符
    [^]     代表指定范围外的任意单个字符
    [a-z]   代表所有单个小写字母
    [A-Z]   代表所有单个大写字母
    [:digit:]代表所有单个数字
    [:upper:]代表所有单个大写字母
    [:lower:]代表所有单个小写字母
    [:alpha:]代表所有单个字母
    [:blank:]代表水平空格或tab键
    [:space:]代表空格
    [:punct:]代表标点符号
    [:xdigit:]代表十六进制
通配符 * 的应用:
    [[email protected] rc.d]# ls  #列出此目录下的所有内容
    init.d  rc0.d  rc2.d  rc4.d  rc6.d     rc.sysinit
    rc      rc1.d  rc3.d  rc5.d  rc.local
    [[email protected] rc.d]# ls rc.*   #列出此目录下所有以rc.开头任意长度字符结尾的文件
    rc.local  rc.sysinit
通配符 ? 的应用:
    [[email protected] rc.d]# ls r?  #列出以r开头后面紧跟任意单个字符结尾,可与*对照之
    rc
通配符 [ ] 的应用:
    [[email protected] rc.d]# mkdir b  #创建目录b
    [[email protected] rc.d]# ls       #查看目录内容
    b       rc     rc1.d  rc3.d  rc5.d  rc.local
    init.d  rc0.d  rc2.d  rc4.d  rc6.d  rc.sysinit
    [[email protected] rc.d]# ls -d  [ib]*  #以i或者b开头的目录
    b  init.d
        注意的是: [[?*\] 指的是匹配"[","?","\","三个字符中的一个并不代表通配符
                 [][!] 指的同样也是中间的三个字符
通配符 [!] 的应用:
    [[email protected] rc.d]# ls -d [!ib]*  #i或者b开头的目录
    rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit
通配符 [^] 的应用:
    效果与[!]相同
通配符 [:alpha:] 的应用
    效果类似于[]基本相似,只不过匹配内容是描述符所描述的含义

与shell中通配符不同的有另一种描述符?

正则表达式中字符可分为两种:文本字符和元字符.
正则表达式分为基本正则表达式和扩展正则表达式.

元字符(metacharacter):在正则表达式中具有特殊意义的字符,使得正则表达式具有文件处理能力.

1.描述字符本身
    \       转义字符(跳脱字符)其后的字符还原为本来的含义,不做特殊字符
    .       代表任意单个字符
    []      代表括号中指定的任意单个字符
    [^]     代表除括号中指定的任意单个字符
    [:alnum:]代表所有的数字和字母中的任意单个字符
    [:digit:]代表所有数字中的任意单个字符
    [:alpha:]代表所有英文字母中的任意单个字符
    [:lower:]代表所有小写英文字母中的任意单个字符
    [:upper:]代表所有大写英文字母中的任意单个字符
    [:space:]代表空格
    [:punct:]代表标点符号
    [:blank:]代表水平空格或tab键
2.描述字符出现次数
  基本正则:
    *       代表前面单个字符或字符串(分组)出现任意次
    \?      代表前面单个字符或字符串(分组)出现零次或一次
    \+      代表前面单个字符或字符串(分组)出现至少一次
    \{n\}   代表前面单个字符或字符串(分组)出现n次
    \{m,n\} 代表前面单个字符或字符串(分组)至少出现m次至多出现n次
    \{m,\}  代表前面单个字符或字符串(分组)至少出现m次多则不限
    \{,n\}  代表前面单个字符或字符串(分组)至多出现n次少则不限
  扩展正则:
    *       代表前面单个字符或字符串(分组)出现任意次
    ?       代表前面单个字符或字符串(分组)出现零次或一次
    +       代表前面单个字符或字符串(分组)出现至少一次
    {n}     代表前面单个字符或字符串(分组)出现n次
    {m,n}   代表前面单个字符或字符串(分组)至少出现m次至多出现n次
    {m,}    代表前面单个字符或字符串(分组)至少出现m次多则不限
    {,n}    代表前面单个字符或字符串(分组)至多出现n次少则不限
3.描述字符的位置(位置锚定)
    ^       代表以紧跟其后的字符开头的行
    $       代表以紧跟其后的字符结尾的行
    \<      代表以紧跟其后的字符或字符串做单词的开头
    \>      代表以紧跟其后的字符或字符串做单词的结尾
    \< \>   代表以中间字符或字符串为整个单词
    \b \b   是\c \>的另一种表示方法
    分组 () 多个字符括起来作为一个整体字符串使用
几个常用组合:
    ^$代表空行
    .*代表任意字符出现任意次

grep 命令简单用法:搜索文本中的所需的关键字

 grep  [OPTIONS] PATTERN [FILE...]
 grep  [OPTIONS] [-e PATTERN | -f FILE] [FILE...] 
    -i      忽略关键字大小写
    -n      显示搜索到的内容在原文件中的行
    -v      取反显示;显示没有匹配到的行
    -c      显示匹配到内容多少行
    -o      仅显示匹配到的字符串 
    -An     显示匹配到的内容的行及后n行
    -Bn     显示匹配到的内容的行及前n行
    -Cn     显示匹配到的内容的行及前后n行
    -e      指定多个关键字
        grep -e "root" -e "ntp" /etc/passwd
    -w      显示匹配到内容的单词数
    -E      使用扩展的正则表达式相当于egrep
元字符的应用:

1.去掉/etc/rc.d/rc.local中的#开头和空行?

    [[email protected] rc.d]# cat rc.local 
    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don‘t
    # want to do the full Sys V style init stuff.

    touch /var/lock/subsys/local
    [[email protected] rc.d]# cat rc.local | egrep -v ^$ | grep -v ^#
    touch /var/lock/subsys/local
    简化:
    [[email protected] rc.d]# cat rc.local  | grep  -v -E  "^#|^$" 
    touch /var/lock/subsys/local

2.取出ifconfig的ip地址

    [[email protected] rc.d]# ifconfig  | egrep -o -E  \([0-2]?[0-9]?[0-9]\.\){3}[0-9]+|head -1
    172.16.253.171
    简化:
    [[email protected] rc.d]# ifconfig | egrep -o  "([0-9]+\.){3}[0-9]+"|head -1 
    172.16.253.171
    另一种方法:
    [[email protected] rc.d]# ifconfig|grep "inet addr" | cut -d: -f2 | cut -d" " -f1|
    head -1
    172.16.253.171

3.找出/etc/passwd中用户名与shellming相同的?

    [[email protected] rc.d]# cat /etc/passwd |grep --color=auto -E "(^[[:alnum:]]+):.*\1$"
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt

4.找出/var目录下所有的以.log结尾的文件所在路径?

    [[email protected] rc.d]# find  /var -name *.log | grep -o -E "/.*/" | uniq
    /var/log/audit/
    /var/log/gdm/
    /var/log/tuned/
    /var/log/anaconda/
    /var/log/
    /var/log/mariadb/
    /var/log/

5.找出/var目录下所有的以.log结尾的文件所在基名?

    [[email protected] rc.d]# find  /var -name *.log      # 查找出/var下所有的.log结尾的文件
    /var/log/audit/audit.log
    /var/log/gdm/:1.log
    /var/log/gdm/:0-greeter.log
    /var/log/gdm/:0.log
    /var/log/tuned/tuned.log
    /var/log/anaconda/anaconda.log
    /var/log/anaconda/X.log
    /var/log/anaconda/program.log
    /var/log/anaconda/packaging.log
    /var/log/anaconda/storage.log
    /var/log/anaconda/ifcfg.log
    /var/log/anaconda/ks-script-jwlu_8.log
    /var/log/anaconda/journal.log
    /var/log/vmware-vmsvc.log
    /var/log/Xorg.9.log
    /var/log/wpa_supplicant.log
    /var/log/yum.log
    /var/log/vmware-vmusr.log
    /var/log/mariadb/mariadb.log
    /var/log/Xorg.0.log
    /var/log/pm-suspend.log
    /var/log/pm-powersave.log
    /var/log/boot.log
    [[email protected] rc.d]# find  /var -name *.log  | grep -o -E "[^/]*$"   #正则取出基名
    audit.log
    :1.log
    :0-greeter.log
    :0.log
    tuned.log
    anaconda.log
    X.log
    program.log
    packaging.log
    storage.log
    ifcfg.log
    ks-script-jwlu_8.log
    journal.log
    vmware-vmsvc.log
    Xorg.9.log
    wpa_supplicant.log
    yum.log
    vmware-vmusr.log
    mariadb.log
    Xorg.0.log
    pm-suspend.log
    pm-powersave.log
    boot.log

6、找出/proc/meminfo文件中,所有以大写或小写s开头的行,两种方式:

    [[email protected] rc.d]# cat /proc/meminfo  |grep -E "^[s|S].*"
    SwapCached:            0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Shmem:              9132 kB
    Slab:             148756 kB
    SReclaimable:      88588 kB
    SUnreclaim:        60168 kB
    [[email protected] rc.d]# cat /proc/meminfo  |egrep -i "^s.*"
    SwapCached:            0 kB
    SwapTotal:       2097148 kB
    SwapFree:        2097148 kB
    Shmem:              9132 kB
    Slab:             148756 kB
    SReclaimable:      88588 kB
    SUnreclaim:        60168 kB

7.检索出不以/sbin/nologin为shell的用户,并显示该用户信息在原文件中的行号?

    [[email protected] ~]# egrep  -n -v  "\</sbin/nologin$" /etc/passwd
    1:root:x:0:0:root:/root:/bin/bash
    6:sync:x:5:0:sync:/sbin:/bin/sync
    7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    8:halt:x:7:0:halt:/sbin:/sbin/halt

8.检索shutdown用户,并显示上下1行的内容?

    [[email protected] logs]# egrep  -C1 "^shutdown" /etc/passwd 
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt

9.检索出属主ID(UID),属组ID(GID)相同的用户?

    [[email protected] logs]# egrep  "\<([0-9]+)\>:\1" /etc/passwd|cut -d: -f1
    root
    bin
    daemon
    nobody
    systemd-bus-proxy
    systemd-network
    dbus
    abrt
    tss
    rpc
    usbmuxd


本文出自 “城叙” 博客,请务必保留此出处http://cityx.blog.51cto.com/9857477/1913617

以上是关于通配符与正则表达式元字符的理解及grep的实例应用的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式与grep

正则表达式与grep命令

GNU/Linux 正则表达式与三剑侠(grep,sed,awk)(精)

grep与正则表达式

正则grep工具

Linux正则表达式与通配符