通配符与正则表达式元字符的理解及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的实例应用的主要内容,如果未能解决你的问题,请参考以下文章