在Linux的使用过程中,需要处理大量的文本文件,这很符合Linux的哲学思想——一切皆文件。也是因为如此linux内置了文本处理三剑客,他们分别是grep、sed、awk。而三剑客在使用的过程中又有不同的侧重,今天将主要介绍的是文本过滤工具grep。
1. grep命令的使用
grep 选项 关键字 文本路径
grep root /etc/passwd
grep
--color=auto: 对匹配到的文本着色显示 (7里自动显示,6不显示)
-i: 忽略字符大小写
-n:显示匹配的行号
-o: 仅显示匹配到的字符串
-q: 静默模式,不输出任何信息
-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w:匹配整个单词
2.基本正则表达式
提到grep就不得不说正则表达式,正则表达式分为两类基本正则,扩展正则,以后要用的许多工具都支持正则表达式,如vim,sed,awk,包括Python也支持。正则表达式分为4类元字符:字符匹配、匹配次数、位置锚定、分组
字符匹配:
. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即A-Z, a-z
[:lower:] 小写字母[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
匹配次数:
* 匹配前面的字符任意次,包括0次
.*任意长度的任意字符
\?匹配其前面的字符0或1次
\+匹配其前面的字符至少1次
\{n\}匹配前面的字符n次
\{m,n\}匹配前面的字符至少m次,至多n次
\{,n\}匹配前面的字符至多n次
\{n,\}匹配前面的字符至少n次
位置锚定:
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或\b词首锚定,用于单词模式的左侧
\> 或\b词尾锚定;用于单词模式的右侧
\<PATTERN\>匹配整个单词
分组:
分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例:cat text |grep -o "\(cat\).*\1\b"
后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
或者:\|
示例:
cat text |grep "cat\|dong"
3.基本正则表达式练习
1利用df和grep,取出磁盘各分区利用率,并从大到小排序
df|grep -o "[[:digit:]]\+%"|sort -n
2找出/etc/passwd中的两位或三位数
cat /etc/passwd |grep -o "\b[0-9]\{2,3\}\b"
3将此字符串:welcome to magedu linux中的每个字符去重并排序,重复次数多的排到前面
echo ‘welcome to magedu linux‘ |grep -o ‘[^[:space:]]‘ |sort |uniq -c |sort -nr
4.扩展正则表达式
通过前面的练习我发现正则表达式写的时候有非常多的\,写好看起来和表情包一样,而且写的时候思路很清晰,但写完后阅读性极差,我们引人入了扩展正则即:egrep \ grep -e,其两者规则是一样的,只是扩展正则表达式少了很多\f方便阅读
字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符
次数匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置锚定:
^ :行首
$ :行尾
\<, \b :语首
\>, \b :语尾
分组:
()
后向引用:\1, \2, ...
或者:|
总结:扩展正则在 后项引用\1,\2,\3,语首\<,\b语尾\>,\b的锚定时必须要添加\,其他地方不需要添加\
5.扩展正则练习
1、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
cat /etc/rc.d/init.d/functions |egrep "^.*\>\(\)"
2、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/functions/ |egrep -o "[^/]+/?$"
3、使用egrep取出上面路径的目录名表达式练习
echo "/etc/rc.d/init.d/functions" |egrep -o ".*/." |egrep -o ".*/"
4、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255(经常被用来判断Ipv4地址的正确性)
echo {1..300}|egrep -o "\b[0-9]\b|\b[1-9][0-9]\b|\b1[0-9][0-9]\b|\b2[0-4][0-9]\b|\b25[0-5]\b"(图太长了只截一部分)
5、显示ifconfig命令结果中所有IPv4地址
ifconfig |egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
原文地址:https://www.cnblogs.com/angge/p/9360358.html