1.语法格式
按行模糊过滤文件内容
grep 'Failed' /var/log/secure # 过滤出文件secure中包含Failed的所有行
按行模糊过滤屏幕输出
ifconfig eth0 | grep '192' # 过滤出屏幕中包含192的所有行
2.参数选项
-r用于递归过滤,即过滤当前目录及其子目录中的文件内容
-c用于统计字符出现的次数
-w用于精准过滤,需要注意字符两边不能连接其他字符串(必须是空格)
-v用于取反,过滤出不包含当前字符所在行的其他所有行
扩展
-E 支持扩展正则 ==egrep 该命令也可用于普通正则
-i 不区分大小写,grep默认区分大小写
-n 显示过滤出的内容在文本中的行号
-o 匹配流程,用于查看每次匹配到底匹配到了谁
-A 2 查看过滤到的行以及下2行
-B 2 查看过滤到的行以及上2行
-C 2 查看过滤到的行以及上下各2行
3.正则表达式
正则表达式:为处理大量字符串而定义的一套规则和方法,通过特殊符号快速找到需要的字符串,以行为单位进行处理。
基本正则:Basic Regular Expression,常用^ $ . * []
扩展正则:Extened Regular Expression,常用+ | () {}
4.结合基本正则使用
^$表示空行
grep '^$' 1.txt # 过滤出空行
^表示以...开头
grep '^o' 1.txt # 过滤出以o开头的行
grep '^^' 1.txt # 过滤出以^开头的行
$表示以...结尾
grep 'm$' 1.txt # 过滤出以m结尾的行
grep ' $' 1.txt # 过滤出以空格结尾的行
注意
m=like
grep "$m" 1.txt # 过滤出包含like的行,$表示变量时使用双引号解析变量内容
.表示任意单个字符,空格是字符,但空行(\n回车换行)中没有字符所以不会过滤到
grep '.' 1.txt # 过滤出包含任意单个字符的行
grep '.$' 1.txt # 过滤出以任意字符结尾的行
*表示连续匹配(前一个字符连续出现1次及以上的内容),会输出文本所有的内容。
grep 'w*' 1.txt # 匹配文本中w连续出现1次及以上的内容
[]表示匹配其中任意单个字符,在[]中的符号会被还原本义
grep '[abc]' 1.txt # 过滤出包含a或b或c的行
grep '[a-z]' 1.txt # 过滤出包含a或b或c...或z的行
grep '[a-zA-Z]' 1.txt # 过滤出包含a到z或A-Z的行 == [a-Z]
grep '[a-zA-Z0-9]' 1.txt # 过滤出包含a到z或A-Z或0-9的行
grep '[a-zA-Z0-9,.^$]' 1.txt # 过滤出包含a到z或A-Z或0-9或,或.或^或$的行
grep '^[abc]' 1.txt # 过滤出以a或b或c开头的行
grep '[.;!]$' 1.txt # 过滤出以.或;或!结尾的行
注意:中括号中的第一个^表示取反
grep '[^abc]' 1.txt # 匹配文本中不为a、不为b、不为c的其他所有内容,会输出文本中除了空行的所有内容
5.结合扩展正则使用
+表示连续匹配(前一个字符连续出现1次及以上的内容),但默认不包含空格
egrep 'w+' 1.txt # 过滤出w连续出现1次及以上的行
egrep '[a-z]+' 1.txt # 过滤出a-z连续出现1次及以上的行,由于不含空格所以匹配流程为将匹配到的内容以空格为分割进行换行输出
|表示或者
egrep 'blog|www' 1.txt # 过滤出包含blog或www的行
egrep -v '^#|^$' 1.txt # 过滤出有意义的行(除去注释行与空行)
删除文件中无意义的行
echo `egrep -v '^#|^$' /etc/selinux/config` | xargs -n 1 > 1.txt
cat 1.txt > /etc/selinux/config
()表示一个整体
egrep 'lizhen(u|y)a' 1.txt # 过滤出包含lizhenua或lizhenya的行
{n,m}表示前一个字符连续出现最少n次,最多m次
egrep '8{2,3}' 1.txt # 过滤出8连续出现最少2次,最多3次的行。匹配流程是将连续出现最多次作为一次匹配结果,分割后再进行匹配,如连续的数字888888会被匹配为888\n888
{m}表示前一个字符连续出现m次
egrep '8{3}' 1.txt # 过滤出8出现连续3次的行
egrep '[abc]{3}' 1.txt # 过滤出abc之间任意组合,但出现连续3次的行
egrep '[a-z]{3}' 1.txt # 过滤出a-z之间任意组合,但出现连续3次的行
egrep '[0-9]{3}' 1.txt # 过滤出0-9之间任意组合,但出现连续3次的行
过滤身份证号
egrep '[0-9]{17}[0-9X]' id.txt
egrep '\b[0-9]{17}[0-9X]\b' id.txt # \b表示边界,前后必须是空格 == \< \>
egrep '\<3714[0-9]{13}[0-9X]\>' id.txt # 查找身份证开头为3714