grep 是用于匹配输入数据中符合条件的字符串的工具,其匹配过程支持正则表达式,于是匹配能力很是强大。html
grep 能够从文件或者标准输入设备中读取数据,若不指定任何文件名称,或是所给予的文件名为 -
,则 grep 会从标准输入设备读取数据,不然从文件读取数据进行匹配。
linux
grep 的命令格式以下:正则表达式
grep [option] pattern file [file2…]
咱们先来看看 grep 能匹配什么,也就是 pattern
参数支持哪些形式。shell
这也是最普通的字符串匹配了,直接匹配 pattern
所指的字符串。例如,segmentfault
grep apple file.txt #匹配结果以下,会直接列出匹配的行 apple apple
咱们上面也说到了,grep强大的匹配能力就在于其支持正则表达式,下面咱们来看看 grep 支持的正则表达式语法有哪些。app
首先,grep 默认支持的是如下正则表达式。工具
grep ^a file.txt
匹配a开头的行,注意是要该行的开头是a才会匹配。若是不是在开头出现,即便中间出现了也不会匹配该行。code
grep a$ file.txt
匹配a结尾的行,注意是要该行的结尾是a才会匹配。htm
grep '\<app' #匹配app开头的单词所在的行,例如apple,注意要有引号
grep 'le\>' #匹配le结尾的单词所在的行,例如apple,注意要有引号
grep '\bgrep\b' #只匹配单词grep,例如不会匹配到grepa
. grep .a file.txt #匹配任意一个字符 例如 aa,ba等 [] grep "[abc]c" file.txt #匹配[]里的任意一个字符,例如ac或者bc或者cc,注意加引号 grep "[a-z]a" file.txt #匹配a-z间的26个字母任意一个字符,例如aa [^] grep "[^ab]a" #匹配除ab以外的任意一个字符,例如da \w grep "\w" file.txt #匹配文字和数字字符,也就是[A-Za-z0-9] \W grep "\W" file.txt #\w的反置形式,匹配一个或多个非单词字符,如点号句号等
* grep "a*b" file.text # *前面的字符重复0到屡次,例如b,ab,aab \{m\} grep "x\{m\}" file.text #重复字符x,m次,如:grep '0\{3\}'匹配包含3个0的行 \{m,\} grep "x\{m,\}" file.text #重复字符x,至少m次,如:'0\{5,\}'匹配至少有5个0的行 \{m,n\} grep "x\{m,n\}" #重复字符x,至少m次,很少于n次,如:'0\{5,10\}'匹配5--10个0的行
除了上面默认支持的模式以外,grep 还支持拓展匹配模式,拓展匹配模式要加参数 -E
,支持的拓展匹配模式以下:blog
? grep -E 'go?d' file.txt #?匹配0个或1个在其以前的字符,例如这里匹配gd,god + grep -E 'go+d' file.txt #?匹配1个或多个在其以前的字符,例如这里匹配god,good等 () grep -E 'g(oo)d' file.text #匹配括号里的字符串,通常都是和其余匹配模式一块儿使用,例如 grep -E 'g(oo)?d' file.text | grep -E 'god|good' file.txt #匹配被|分隔的多个字符串,例如此例匹配god或者good
注意点
grep 'go\?d' file.txt
了解了 grep 能匹配哪些数据以后,咱们再来了解下 grep 可用的参数,grep 的参数主要用来影响查找的过程以及打印结果的。
-a 将二进制文档以文本的方式来查找 -d <动做> 当指定要查找的含有目录(例如 grep apple ./*),必须使用这项参数,不然grep指令将回报信息并中止动做。其中动做支持,skip:跳过目录,recurse:递归读取目录的数据 -E 开启对拓展匹配模式的支持,如上面的例子 -f 指定匹配模式规则文件,其内容含有一个或多个匹配模式规则,格式为每行一个匹配模式规则。 -F 等同于fgrep命令,也就是fast grep,会把全部的字符都看做普通字符,也就是说正则表达式中的全部字符表示回其自身的字面意义,再也不特殊。 -i 忽略字符大小写的差异 -r/-R 此参数的效果和指定"-d recurse"参数相同。 -w 单词匹配,等同于 "\<word\>"或者"\bword\b" -y 忽略关键字符的大小写。(跟-i参数相同)
-A <num> 除了显示符合模式的那一列以外,再显示该行以后num行的内容 -B <num> 除了显示符合模式的那一列以外,再显示该行以前num行的内容 -b 在匹配到行的开头标示该行的第一个字符前面总共多少byte数据 -color 以特定颜色高亮显示匹配关键字 -c 仅显示匹配行的总行数 -C <num> 除了匹配的那一行以外,并显示该行以前后各num行的内容,其中C是能够省略的,能够直接 grep -4 apple file.txt -h 在显示匹配的那一行以前,不显示该行所属的文件名称(不加这个参数,匹配多个文件的时候会显示命中文件的名字) -H 在显示匹配的那一行以前,表示该行所属的文件名称(不加这个参数,匹配单个文件的时候不会显示命中文件的名字) -l 只显示命中的文件的名称 -L 只显示没命中的文件的名称 -n 显示命中的行所在的行数 -o 只显示匹配的部分,不显示该行其余的部分 -P 使用perl的正则表达式语法,由于perl的正则更加多元化,能实现更加复杂的场景。典型用法是匹配指定字符串之间的字符。(-e或-E是匹配扩展正则表达式,-P是匹配perl正则表达式) -q 不显示任何信息 -s 不显示错误信息 -v 显示不包含匹配文本的全部行 -V 显示版本信息 -x 只显示整行都符合的列。
https://zh.wikipedia.org/wiki/Grep#egrep%E5%92%8Cfgrep
https://www.runoob.com/linux/linux-comm-grep.html
http://www.javashuo.com/article/p-ztgyyxyh-bg.html
Enjoy it !
转载请注明做者和文章出处
做者: X先生
http://www.javashuo.com/article/p-uftfacnt-nx.html