grep:
Linux文本处理三剑客
grep:文本过滤(模式:pattern)工具
grep,egrep,fgrep
sed:行编辑器,文本编辑工具
awk:Linux上的实现gawk,文本报告生成器
grep:
作用:文本搜索工具,根据用户指定的"模式"对目标文本逐行进行匹配检查
模式:由正则表达式字符及文本字符所编写的过滤条件
正则表达式:由一类特殊字符及正常的文本字符所编写的模式,其中有些字符不表示字符字面意义,表示控制或通配功能
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
egrep,grep -E
grep [OPTIONS] PATTERN [FILE...]
常用选项:
--color=auto:对匹配到的文本着色显示
例:
grep --color=auto root /etc/passwd #查找/etc/passwd中带有root的字符串并打印到屏幕
-v:取反
例:
grep -v root /etc/passwd #不带有"root"的行打印到屏幕
-F:相当于fgrep,不使用正则表达式,比"grep,egrep"匹配时间快一点儿
例:
fgrep root /etc/passwd #不使用正则表达式匹配"root"
-i:匹配时忽略字符大小写
例:
grep -i RooT /etc/passwd #匹配"root"字符,忽略大小写,还是能像上面一样直接匹配出"root"
-o:仅显示匹配的字符串本身
例:
grep -o root /etc/passwd #结果将会是"root",并且只有"root"
-q:静默输出,匹配到后不输出到屏幕上
例:
grep -q root /etc/passwd #匹配到字符后不会输出到屏幕上,可以用echo $?判断命令执行是否成功
-A:显示匹配到的行及行后面指定的多行
例:
grep -A2 root /etc/passwd #匹配含有"root"的行以及行后面的两行
-B:显示匹配到的行及行前面指定的多行
例:
grep -B2 root /etc/passwd #匹配含有"root"的行以及前面的两行
-C:显示匹配到的行及前后指定的多行
例:
grep -C2 root /etc/passwd #匹配含有"root"的行以及前后各两行
-E:使用正则表达式
基本正则表达式元字符:
字符匹配
.:匹配任意单个字符
例:
grep "s..n" /etc/passwd #匹配/etc/passwd中"s"开头"n"结尾,两者之间是任意两个字符的所有行
grep "...t" /etc/passwd #匹配/etc/passwd中任意三个字符后边是"t"的行
[]:匹配括号中内的任意单个字符
[^]:匹配指定范围外的任意单个字符,取反
[[:digit:]]、[[:lower:]]、[[:upper:]]、[[:alpha:]]、[[:alnum:]]、[[:space:]]
匹配次数:用在要指定出现多少次的字符后面,用于指定前面的字符要出现的次数
*:匹配前面的字符任意次,贪婪模式,前面的字符可以出现0次,1次或多次
.*:任意长度的任意字符
\?:匹配前面的字符0次或1次,即前面字符可有可无
\+:匹配前面的字符至少出现1次,多则不限
\{m\}:匹配前面的字符m次,指定多少次就是多少次
\{m,n\}:匹配前面的字符至少m次,最多n次
\{0,n\}:匹配前面的字符最多n次
\{m,\}:匹配前面的字符最少m次
位置锚定
^:行首锚定,写在模式最左侧
例:grep ^root /etc/passwd #匹配/etc/passwd文件中以root开头的行
$:行尾锚定,写在模式最右侧
^PATTERN$:用于模式匹配整行
^$:匹配空行,一整行都是空的
^[[:space:]]*$:空白可有可无,有任意一个空白都算
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配整个单词
分组:
\(\):将多个字符组成一个整体来匹配
例:echo "xyxxyxyabcxy" | grep \(xy\)+ #至少匹配"xy"一次
Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3...
\1:从左侧起第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
例:\(ab\{1,\}\(xy\)*\) #\1匹配到ab\{1,\}\(xy\)*
#\2匹配到xy
后向引用:引用前面分组括号中的模式所匹配字符(而非模式本身)
例:grep '\([[:alpha:]]\{1,3\}t\>\).*1' /etc/passwd #查看结果分析
练习
1、显示/proc/meminfo文件中以大小写s开头的行(要求:使用两种方式)
解:(1) grep "^[sS]" /proc/meminfo
(2) grep -i "^s" /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
解:grep -v "/bin/bash$" /etc/passwd
3、显示/etc/passwd文件中ID号最大的用户的用户名
解:cat /etc/passwd | sort -t: -k3 -nr | head -n1 | cut -d: -f1
#将cat的结果传输给后面的sort命令,用"-t"指定分隔符,以第三列为基准进行数字倒叙排序,使用cut取出第一列
4、如果用户root存在,显示其默认的shell程序
解:grep ^root /etc/passwd | cut -d: -f7
5、找出/etc/passwd中的两位或三位数
解:grep "\<[[:digit:]]\{2,3\}" /etc/passwd
6、找出"netstat -tan"命令结果中以"LISTEN"后跟0、1或多个空白字符结尾的行
解:netstat -tan | grep "LISTEN[[:space:]]\{,1\}"