通配符与正则表达式元字符的理解及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
时间: 2024-10-22 08:42:59

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

shell 通配符和正则表达式理解和区别

一.正则表达式: 元字符是用来阐释字符表达式意义的字符,简言之,就是用来描述字符的字符. 正则表达式RE(Regular Expression)是由一串字符和元字符构成的字符串. 正则表达式的主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合.实际上正则表达式完成了数据的过滤,将不满足正则表达式定义的数据拒绝掉,剩下与正则表达式匹配的数据.                         基本的正则表达式元字符集合及其意义 符号 意义 * 0个或多个在*字符之前的那个普通字符和前

通配符和正则表达式-grep,egrep,fgrep

通配符和正则表达式-grep,egrep,fgrep 通配符和正则表达式,通配符用于文件名匹配,命令支持ls,cp,rm等;正则为通用匹配,命令支持grep,awk,sed,vi,find等.文本过滤工具grep,egrep,fgrep 通配符 *  匹配零个或多个任意字符 ?  匹配单个任意字符 [] 匹配指定范围内的一个字符,[]括号中的 字符间隔符 可以省略,如,\=:等等.举例[1:2=3,5\7] = [12357],也推荐使用这种省略写法作为标准 ^  取反,表示非.注意:非数字即包

通配符和正则表达式

在看鸟哥的Linux私房菜的时候看到十二章一直强调通配符和正则表达式的区别,在我的理解中,两者貌似是一样的都是用来匹配的.Google之网上给出的答案是: 在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的 而通配符多用在文件名上,比如查找find,ls,cp,等等 下表是鸟哥给的Linux下的通配符 符號 內容 * 萬用字元,代表 0 個或多個字元(或數字) ? 萬用字元,代表『一定有』一個字母 # 註解,這個最常被使用在 script 當中,視為說明! / 跳脫

正则表达式——元字符

要想学会正则表达式,理解元字符是一个必须攻克的难关. 不用刻意记 .:匹配任何单个字符. 例如正则表达式"b.g"能匹配如下字符串:"big"."bug"."bg",但是不匹配"buug","b..g"可以匹配"buug". [ ] :匹配括号中的任何一个字符. 例如正则表达式"b[aui]g"匹配bug.big和bag,但是不匹配beg.baug

通配符与正则表达式

        通配符 元字符 作用 * 匹配0个或任意多个字符,也就是可以匹配任何内容 ? 匹配任意一个字符 [] 匹配[ ]中任意一个字符 [-] 匹配括号中任意一个字符,-代表一个范围 [^] 逻辑非,表示匹配不是中括号内的一个字符         基础正则表达式 元字符 作用 * 前一个字符重复0次或多次,表示匹配任意字符,包括空白行 . 匹配除了换行符以外任意一个字符,".*"匹配所有内容 ^ 以什么开头的行,  ^h以h开头的行 $ 以什么结尾的行, $h以h结尾的行 [a

linux通配符与正则表达式

通配符 *  任意字符,可重复多次 ? 任意字符,重复一次 [] 代表一个字符 举例: [a,b,c] 表示abc中任意一个 通配符的作用是用来匹配文件名的 正则表达式 正则表达式是在文件中匹配符合条件的字符串的 ls find cp是不支持正则表达式的 但是grep awk sed支持正则表达式 [[email protected] test]# touch aa [[email protected] test]# touch aab aabb [[email protected] test]

Sed 命令详解 正则表达式元字符

1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上.sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示.处理完输入文件的最后一行后,sed便结束运行.sed把每一行都存在临时缓冲区中,对这个副本进行编辑,

shell中正则表达式元字符

'.'    匹配任一字符 '*'   指定*前的字符可以连续重复使用任意次 '^'   字符串开头 '$'   字符串结尾 '.*'   任意数量的字符 '\'     转义字符 '[...]' 匹配任一字符 '[^...]' 不匹配任一字符,取反 '\(....\)'  标记匹配字符,后续通过转义序列进行引用,例如\(grep\).*\1,匹配2个grep中间带有任意数目的字符 '\n'  重复在\(...\) 内的第n个模式 x\{m,n\} 区间表达式,匹配x字符出现的次数区间.x\{n

通配符和正则表达式的区别

而通配符多用在文件名上,比如查找find,ls,cp,等等 下表是鸟哥给的Linux下的通配符 符號 內容 * 萬用字元,代表 0 個或多個字元(或數字) ? 萬用字元,代表『一定有』一個字母 # 註解,這個最常被使用在 script 當中,視為說明! / 跳脫符號,將『特殊字元或萬用字元』還原成一般字元 | 分隔兩個管線命令的界定: ; 連續性命令的界定(注意!與管線命令並不相同) ~ 使用者的家目錄 $ 亦即是變數之前需要加的變數取代值 & 將指令變成背景下工作 ! 邏輯運算意義上的『非』