正则表达式及grep
Posted 九月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式及grep相关的知识,希望对你有一定的参考价值。
正则表达式及grep
#以下所有的举例是用正则表达式的方式
#正则表达式
#由一类特殊字符及文本所编写的模式
#分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
字符匹配选项
. 匹配任意单个字符 | [] 匹配指定范围内的任意单个字符 |
示例:cat /etc/passwd | grep "roo." 查看/etc/passwd目录下 显示包含roo后面加任意单个字符的行 | 示例:cat /etc/passwd | grep [bin] 查看/etc/passwd目录下 显示包含b、i、n其中任意一个字母的行 |
[^] 匹配指定范围外的任意单个字符 | [:alnum:] 任意字母和数字 |
示例:cat /etc/passwd | grep [^bin] 查看/etc/passwd目录下 显示除b、i、n三个字母之外任意的字符全部是要找的字符 | 示例:cat /etc/passwd | grep [[:alnum:]] 查看/etc/passwd目录下 显示包含任意字母和数字的行 |
[:alpha:] 代表任何英文字母大小写 例[a-z] [A-Z] | [:lower:] 小写字母[a-z] [:upper:] 大写字母[A-Z] |
示例:cat /etc/passwd | grep [[:alpha:]] 查看/etc/passwd目录下 显示包含任意大小写字母的行 | 示例:cat /etc/passwd | grep [[:lower:]] 查看/etc/passwd目录下 显示包含任意小写字母的行 [:upper:] 同理 |
[:blank:] 空白字符(空格和制表符) | [:space:] 水平和垂直的空白字符 |
[:cntrl:] 不可打印的控制字符 (退格、删除....) | [:digit:] 十进制数字 [:xdigit:] 十六进制数字 |
[:graph:] 可打印的非空白字符 | [:print:] 可打印字符 [:punct:] 标点符号 |
下面几个命令大概都类似 只是用/etc/passwd这个目录来举例做简单的示范 几个匹配字符还可以进行组合 接下来会进行举例
匹配次数选项
\+ 匹配前面的字符至少一次 | .* 任意长度的任意字符 |
示例:cat /etc/passwd | grep ["o"\+] 查看/etc/passwd 目录下每行包含o后面的全部内容 | 示例:cat /etc/passwd | grep o.* 查看/etc/passwd 目录下每行包含o后面的全部内容 |
\? 匹配其前面的字符0或1次 | * 匹配前面或后面的字符0到无穷次 尽可能长的匹配 |
\{n\} 匹配前面的字符n次 n代表任意一个数字 | \{m,n\} 匹配前面的字符至少m次 至多n次 |
\{n,\} 匹配前面的字符至少n次 | \{,n\} 匹配前面的字符至多n次 |
示例: cat /etc/passwd | grep "1\{3,\}" 查看/etc/passwd 目录下前面是1后面最少跟三个1的行 |
示例: cat /etc/passwd | grep "1\{,3\}" 查看/etc/passwd 目录下前面是1后面最少0最多跟三个1的行 |
位置锚定选项
^ 锚定行首 用于模式的最左侧 | $ 行尾锚定 用于模式的最右侧 |
示例:cat /etc/passwd | grep ^"\<root\>" 查看/etc/passwd 目录下(用^锚定行首 用\< \>锚定一个单词 )root开头的行 | 示例:cat /etc/passwd | grep “[[:space:]]\+”$ 查看/etc/passwd 目录下结尾是空白的行 注意区分 没有用到下面一行的命令 |
\< \> 锚定一个单词的词首词尾 | ^$ 空行 ^[[:space:]]*$ 空白行 |
#扩展正则表达式
#扩展正则表达式去正则表达式的区别是扩展正则表达式中新添加了几个与正则表达式有区别的新内容
? 0次或者1次 | {m} 匹配m次 m是正常数字 |
+ 1次或者多次 | {m,n} 至少m 至多n次 m和n都是数字 但是n要大于m |
用法是一样的 就不在举例说明
# grep命令
# 作用:作为强大的文本搜索工具,它能使用这则表达式搜索文本,并把匹配的打印出来。
选项
-v 显示不被pattern匹配到的行 |
示例:cat /etc/passwd | grep -v root 显示/etc/passwd 目录下不包含root的行 |
-i 忽略字符大小写 |
示例:cat /etc/passwd | grep -i ROOT 显示/etc/passwd 目录下包含root的行 不区分大小写 |
-o 仅显示匹配到的字符串 |
示例:cat /etc/passwd | grep -o root 仅显示/etc/passwd 目录能匹配到的几个root 别的不会显示 |
-c 统计匹配到的行数 |
示例:cat /etc/passwd | grep -c root 仅显示/etc/passwd 目录下有几行能匹配到root 如只有两行包含root 那结果只会显示”2“ |
-e 同时实现多个选项间的逻辑or关系 例 grep -e "cat" -e "dog" |
查找文件下面有没有cat 或dog这两个字符串 有一个显示一个 有两个显示一双 |
-n 显示匹配到的行号 (上面这几个选项常用) |
示例:cat /etc/passwd | grep -n root 结果如果只有第五行和第六行包含root 那会在这两行前面第五行前面标5 第六行前面标6 |
-F 相当于fgrep |
fgrep不支持正则表达式 |
-q 静默模式 不输出任何信息 |
输出结果不会有任何显示 有自己的适用场景 |
-E 使用ERE |
相当于适用egrep |
--color 对匹配到的文本着色显示 |
在CentOs7上默认会显示颜色 7以下的系统会用到这个命令 |
#习题
#每题不止一种写法 这里只写一种作为举例
#显示/proc/meminfo文件中以大小s开头的行
例:cat /proc/meminfo | grep "^[sS]"
SwapCached: 0 kB
SwapTotal: 1952764 kB
SwapFree: 1952764 kB
Shmem: 22500 kB
Slab: 317344 kB
SReclaimable: 252192 kB
SUnreclaim: 65152 kB
#找出“netstat -tan” 命令的结果中以‘LISTEN’ 后跟多个空白符结尾的行
例:netstat -tan | grep "LISTEN[[:space:]]\+$"(貌似看不太出来 其实每行后面都有空白的部分)
netstat -tan | grep "LISTEN [[:space:]] \+ $"
管道重定向 空白字符 至少一次 行尾锚定
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
#利用df和grep,取出磁盘各分区利用率,并从大到小排序
例:df -h | grep -o "[[:digit:]]\+%" | grep -o "[0-9]\{1,2\}" | sort -nr
df -h | grep -o
显示磁盘使用率 管道重定向 只显示搜索的特定内容
"[[:digit:]] \+ %" | grep -o "[0-9] \{1,2\}"
十进制数字 最少一次 数值后面用%结尾 显示0-9之间 一位或者两位数
| sort -nr
给找到的数值排序 用数字由大道小的方式排序
#将此字符串:welcome to beijing 中的每个字符去重并排序,重复次数多的排到前面
echo "welcome to beijing " | egrep -o "[[:alpha:]]" | sort | uniq -c | sort -nr
(最后的最后答案写出来了 如果不太明白解释自己去查吧 ok)
以上是关于正则表达式及grep的主要内容,如果未能解决你的问题,请参考以下文章