grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep.
egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
grep一般格式为:
grep [选项]基本正则表达式[文件],这里正则表达式可为字符串。
grep选项:
-c 只输出匹配的行数。
grep -c "aaa" a.txt
-i 不区分大小写
grep -i "AAA" a.txt
-n 显示匹配行及行号
注意其与-c的区别:
-c显示的是有几行匹配上了,而-n是哪行被匹配上了
grep -n "aaa" a.txt
-h 查询多文件时不显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-s 不显示不存在或者无匹配文本的错误信息
不显示查找文件名等不存在或者错误信息
grep -s "root" /etc/password
也可以用
grep "root" /etc/password >/dev/null 2>&1
2>&1 指将标准信息输出路径指定为错误信息输出路径(也就是都输出在一起)
grep -v "aaa" a.txt
精准匹配
在一个文件中,假如有48,484这样一个字符串的话,我们执行 grep “48” *.txt中,这俩个字符串都会被匹配上,但是我们只想精准匹配48,我们可以这么写:
grep '48\>' *.txt
使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用
正则表达式时最好用单引号括起来,这样可以防止 g r e p中使用的专有模式与一些 s h e l l命令的
特殊方式相混淆。
模式范围
以48开头,以3或者4结尾,483,484
grep '48[34]' *.txt
匹配行首是p的
grep '^p' *.txt
不匹配行首p
grep '^[^p]' *.txt
使用-i选项可以不区分大小写,这里我们也可用[]
grep '[Ss]ept' *.txt
匹配头俩个是大写字母,中间俩个任意,并以c结尾
grep '[A-Z][A-Z]..c' *.txt
第一个字符为 5,后跟两个点,接着是 1 9 9,剩余两个数字是6或8。
grep '5..199[6,8]' *.txt
数字4至少重复出现俩次的所有行
grep '4\{2,\}' *.txt
有时要查询重复出现次数在一定范围内,比如数字或字母重复出现 2到6次,下例匹配数
字8重复出现2到6次,并以3结尾
grep '8\{2,6}3' *.txt
使用grep匹配 与 或者 或模式 -E
查找222 或者是333的方法
grep -E '222|333' *.txt
结合使用^和$可查询空行
grep '^$' *.txt
匹配特殊字符 例如$ . ’ ” [] * ^ | + ? 在这些字符前加\
grep '\.' *.txt
最多六个小写字符,后跟句点,接着是两个大写字符
grep '[^a-z]\{1,6/}\.[A-Z]\{1,2/}' *.txt
对一个字符串也可以使用grep
str="hello nihao"
echo $str |grep "hell0"