grep – 基本集
强大的文本搜索工具,能使用正则表达式搜索文本,并把匹配的行打印出来。grep主要作用是过滤出指定的行,指定的行满足什么条件,满足的条件可配合正则表达式来表示,实现强大的文本处理
文本处理工具分类
常用的有:grep,egrep,fgrep
三者区别
grep: 在没有参数的情况下,只输出符合RE(Regular Expression)字符。
egrep:等同于grep -E,和grep最大的区别就是表现在转义符上, 比如grep 做次数匹配时\{n,m\}, egrep则不需要直接{n,m}。egrep显得更方便简洁。
fgrep:等同于grep -f,但是不能使用正则表达式。所有的字符匹配功能均已消失。
grep的option选项说明
--color 显示颜色的参数,即搜索出来的关键字符带有颜色。使用"grep --color 关键字符" 或者 "grep --color=auto 关键字符"。一般配置别名alias grep="grep --color" -a 不要忽略二进制数据。使用"grep -a 关键字符" -A 显示符合关键字符的行, 以及其后面的n行。使用 "grep -An 关键字符" 或者 "grep -A n 关键字符" -b 显示符合关键字符的行, 以及其前后的各n行。使用"grep -bn 关键字符", 注意这个不能使用"grep -b n 关键字符"! 跟-C参数差不多,但是会多打印出行号!!! -B 显示符合关键字符的行, 以及其前面的n行。 使用 "grep -Bn 关键字符" 或者 "grep -B n 关键字符" -c 只输出匹配行的计数。即只显示出匹配关键字符的那行的行数,不显示内容!使用"grep -c 关键字符" -C 显示符合关键字符的行, 以及其前后的各n行。使用 "grep -Cn 关键字符" 或者 "grep -C n 关键字符"。 跟-b参数差不多,-b参数会多打印行号出来! -d 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。 -d后面跟的是进行的动作,一般是"grep -d read"或"grep -d recure",后面会有小示例说明。 -e 指定字符串作为查找文件内容的关键字符。使用"grep -e 关键字符"。grep -e "正则表达式" 文件 -E 将关键字符为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式!!通常用于满足多个条件中的其中一个条件 进行搜索。使用grep -E "条件1|条件2|条件2" -f 显示两个文件中相同的行。使用 "grep -f filename1 filename2 " 或者 "grep --file filename1 filename2", 相等于"cat filename1 filename2|sort|uniq -d",即取交集! -F 将关键字符视为固定字符串的列表。使用"grep -F 关键字 filename1" 或者 "grep -F 关键字符 filename1 filename2 filenamen", 会显示出来关键字所在的文件的列表。 -G 将关键字符视为普通的表示法来使用。 -h 对多文件搜索关键字符时不显示文件名,只显示关键字符。使用"grep -h 关键字符 filename1 filename2 filenamen", 不显示文件名,只显示关键字符。 -H 对多文件搜索关键字符时显示文件名和关键字符,跟-h参数相反。 使用"grep -H 关键字符 filename1 filename2 filenamen", 显示"文件名:关键字符"。 -i 忽略关键字符的大小写。(跟-y参数相同)。使用"grep -i" -l 对多文件搜索关键字符时只显示文件名。使用"grep -l 关键字符 filename1 filename2 filenamen",只显示文件名, 不显示关键字符。 -L 对多文件搜索关键字符时,只显示不匹配关键字符的文件名。使用"grep -L 关键字符 filename1 filename2 filenamen", 只显示不匹配关键字符的文件。 -n 显示匹配关键字符的行号和行内容。使用"grep -n 关键字符 filename" -q 不显示任何信息。用于if逻辑判断,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。 -R/-r 此参数的效果和指定"-d recurse"参数相同。 -s 当搜索关键字符,匹配的文件不存在时不显示错误信息。即不显示不存在或无匹配文本的错误信息。 使用"grep -s 关键字符 filename" -v 反转或过滤搜索,即过滤出来那些不匹配关键字符的行。使用"grep -v 关键字符" -w 精准搜索关键字符,即只显示完全匹配关键字符的行,不显示那些包含关键字符的行。使用"grep -w 关键字符", 或者使用grep "\<关键字符\>",或者使用grep "\b关键字符\b" -x 只显示整行都是关键字符的行。使用"grep -x 关键字符"。 -y 忽略关键字符的大小写。(跟-i参数相同)。"grep -y"。 -o 只输出文件中匹配到的部分, 不会打印多余的内容。 -P 使用perl的正则表达式语法,因为perl的正则更加多元化,能实现更加复杂的场景。 典型用法是匹配指定字符串之间的字符。(-e或-E是匹配扩展正则表达式,-P是匹配perl正则表达式)
grep正则表达式元字符集(基本集)
^
匹配行的开始 如:'^grep'匹配所有以grep开头的行。
$
匹配行的结束 如:'grep$'匹配所有以grep结尾的行。
.
匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
*
匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[]
匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。即[mn]表示匹配m或者n关键字符,相当于grep -E "m|n"。
注意[]里面不要放太多关键字符,容易混乱!只要放[]里面的都是要匹配的关键字符!
[^]
匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母,但是包含rep并且rep不在开头(即*req)的行。
\(..\)
标记匹配字符,如'\(love\)',love被标记为1。
\<
匹配单词的开始,如:'\
\>
匹配单词的结束,如'str\>'匹配包含以str结尾的单词的行。通常使用"\<关键字符\>"作为精准匹配,相当于grep -w
x\{m\}
重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w
匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W
\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b
单词锁定符,如: \byang\b 表示只匹配yang。相当于grep -w "yang" 或者 grep "\<yang\>"
+
匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
注意:先前字符必须使用()或[]括起来,并且使用grep -E。
?
匹配零个或一个先前的字符。如:'(gr)?p'匹配gr后跟一个或没有字符,然后是p的行。注意:先前字符必须使用()或[]括起来,
并且使用grep -E。
a|b|c
匹配a或b或c。如grep -E "a|b|c", 匹配a或b或c中的任意一个都可以。grep -v "a\|b\|c" 或 egrep -v "a|b|c" 过滤掉a或b
或c中的任意一个进行搜索。
()
分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。举例
文件内容如下
AFG AFS BAU CdC 000823 ERU jNNNA IFI entegor jKL NNN MYSQL QQQ UUU CCS ONLINE MPB IFF
过滤以A开头的,后面跟两字符。
cat test | grep "A.."
重复N字母,至少重复3次
cat test | grep "N\{3\}"
匹配先前字符为CS的字符
cat test | grep "cs*"
匹配一个或多个[N]先前字符
cat test | grep -E "[A-Z]+NLINE"
匹配0个或1个[N]先前字符
cat test | grep -E "[A-Z]?NLINE"
匹配0个或多个[N]先前字符
cat sys.list | grep "[A-Z]*NLINE"
至少连续出现6次大写字母
cat test | grep "^[A-Z]\{6\}"
至少连续出现5次大写字母,最多6次
cat test | grep "^[A-Z]\{5,6\}"
匹配love
grep -E \(love\) test
匹配love开通的字符
grep -E "\<love" test
完整匹配单词love
grep -E "\<love\>" test
匹配love结尾
grep -E "love\>" test