grep 指令
grep 指令
grep global search regular expression(RE) and print out the line
Linux grep 命令用于查找文件里符合条件的字符串,如果发现某文件的内容符合所指定的正则模板(grep 默认使用的是 POSIX BRE 字符集),预设 grep 指令会把匹配正则模板的那一列显示出来(注意,在 grep 中,不需要整行都匹配上,只需要有部分匹配上就算匹配上)。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。 PATTERN 部分如果有 POSIX 元字符,一定要带上引号,这一点至关重要(这样可以阻止 shell 试图展开它们),如果只是普通文本,可以不带引号。
关于 shell 展开通配符,请看《Bash 的模式拓展》
grep [options] [-e PATTERN | -f FILE] [FILE...]
另外,也可以使用两个变种程序 egrep 和 fgrep 。 egrep 与 grep -E 相同。fgrep 与 grep -F 相同。在 alias 中可以看到:
find 是根据文件信息(文件名,文件类型,权限,修改时间等)来查询文件。grep 则是查找文件内容
参数解析:
-
-A <显示行数>或--after-context=<显示行数>:除了显示符合正则模板的那一行之外,并显示该行之后的内容。 -
-B <显示行数>或--before-context=<显示行数>:除了显示符合正则模板的那一行之外,并显示该行之前的内容。 -
-C <显示行数>或--context=<显示行数>或-<显示行数>:除了显示符合正则模板的那一行之外,并显示该行之前后的内容。-C <显示行数>就相当于是-A <显示行数>-B <显示行数> -
-b或--byte-offset:在显示符合正则模板的那一行之前,标示出该行第一个匹配到的字符的编号,注意,这个编号是从第一行第一列开始算起的,这个数字没啥意义。 -
-c或--count:计算符合正则模板的行数。注意,配置了这个参数之后,就只会输出匹配的行数的总和。 -
-d <动作>或--directories=<动作>:当指定要查找的是目录而非文件时,必须使用这项参数,否则 grep 指令将回报信息并停止动作。不常用 -
-e <正则模板>或--regexp=<正则模板>:指定字符串做为查找文件内容的正则模板。使用的是 POSIX BRE,grep 默认就是用正则匹配,所以这个参数可以省略 -
-E或--extended-regexp:将正则模板为延伸的正则表达式来使用。使用的是 POSIX ERE,通常直接用 egrep -
-f <规则文件>或--file=<规则文件>:指定规则文件,其内容含有一个或多个正则模板,让grep查找符合则模板的文件内容,格式为每行一个正则模板。注意,这里默认还是使用POSIX BRE,如果想要使用 POSIX ERE,还是要带上-E,比如,grep -E -f rule.txt targetFile.xt -
-F或--fixed-regexp:将正则模板视为固定字符串的列表。也就是说它只能找固定的文本,而不是规则表达式,当然,这样会更快,也就是说,就算你给的正则字符串,它也会当成普通文本字符串来处理,这个跟-G有点像。所以,-F和-E没有办法同时使用。 -
-G或--basic-regexp:将正则模板视为普通的表示法来使用。 不使用正则引擎,把正则模板当成普通文本字符串去匹配,相当于强制用文本字符匹配的方式进行匹配。 -
-h或--no-filename:在显示符合正则模板的那一行之前,不标示该行所属的文件名称。匹配一个和多个文件的时候,匹配内容前会显示这一行属于哪个文件,用这个参数可以隐藏 -
-H或--with-filename:在显示符合正则模板的那一行之前,表示该行所属的文件名称。 -
-i或--ignore-case:忽略字符大小写的差别。老参数了 -
-l或--file-with-matches:列出文件内容符合指定的正则模板的文件名称。例如:grep -l '111' ./*当存在多个目标文件的时候有用,会输出存在匹配行的文件名 -
-L或--files-without-match:列出文件内容不符合指定的正则模板的文件名称。例如:grep -L '111' targetFile.xt 1111.txt,跟-l相反 -
-n或--line-number:在显示符合正则模板的那一行之前,标示出该行的行数编号。 实用,老参数了。 -
-o或--only-matching:只显示匹配 PATTERN 部分。 -
-q或--quiet或--silent:不显示任何信息。 -
-r或--recursive:此参数的效果和指定-d recurse参数相同。eg:递归在当前目录下的所有文件中查找 1,如果是文件夹则递归:grep -nr 1 ./* -
-s或--no-messages:不显示错误信息。 -
-v或--invert-match:显示不包含匹配文本的所有行。 很实用,反向匹配,一般用于不显示文件中的注释行和空行,cat xxx | grep -v '^#' | grep -v '^$' -
-V或--version:显示版本信息。 -
-w或--word-regexp:只显示全字符匹配的行。 -
-x--line-regexp:只显示全行符合的行。整行匹配正则模式这样要求很严格 -
-y:此参数的效果和指定-i参数相同。
常用配置: -C -c -e -E -f -G -F -i -l -n -r -v -x
简单实践:
find / -type f -name "*.log" | xargs grep "ERROR":从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 "ERROR" 的行
find xargs grep三个命令经常相互配合使用
grep -nr 111 ./ 在当前目录下查找 111