Shell常用命令grep用法详解

1. 简介

1.1. 功能

搜索输入文件中满足匹配指定模式的文本行,并将匹配行输出到标准输出。

1.2. 用法

grep [option…] [patterns] [file…]

1.3. 参考

  • 官方手册页面:http://www.gnu.org/software/grep/manual/grep.html
  • 帮助命令:
man grep
grep --help

2. 选项详解

2.1. 匹配控制选项

选项 描述 示例
-e expression,指定正则表达式,可重复指定 echo $'ABCDnAbCdnabcd'|grep -e 'ABC' -e 'abc'
-f file,从文件中读取表达式,一行为一个表达式
-i ignore,忽略大小写 echo $'ABCDnAbCdnabcd'|grep -i 'abc'
-v invert,反向匹配,匹配不满足表达式的行 echo $'ABCDnAbCdnabcd'|grep -v 'ABC'
-w word,单词匹配,匹配表达式在行中为单词的行 echo $'ABC DEFn”DEF"nCDEF'|grep -w 'DEF'
-x exactly,全行匹配,要求整行匹配表达式 echo $'ABC DEFnDEF'|grep -x 'DEF'

2.2. 通用输出控制选项

选项 描述 示例
-c count,只输出匹配到的总行数 echo $'ABCDnAbCdnabcd'|grep -ic 'abc'
-l files-with-matches,只输出包含匹配行的文件名 grep -l 'root' /etc/passwd /etc/hosts
-L files-without-match,只输出不包含匹配行的文件名 grep -L 'root' /etc/passwd /etc/hosts
-m max-count,匹配到指定行数后停止匹配,只输出前面匹配到的行 echo $'AnABnAB'|grep -m 2 'A'
-o only-matching,只输出行中的匹配部分,一行中多个匹配项会分行输出 echo $'AnABnABA'|grep -o 'A'
-q quiet,屏蔽所有输出,只要匹配到了一行,立刻以0状态退出 echo 'A'|grep -q 'A';echo $?
-s slient,屏蔽错误信息 grep -s 'A' nonexistentFile

2.3. 输出前缀控制选项

选项 描述 示例
-b byteOffset,添加匹配行的字节偏移量前缀,结合-o为匹配项的字节偏移量 echo $'BnABnB'|grep -b 'B'
-h hideFileName,不添加匹配行的文件名前缀 grep -h 'root' /etc/passwd /etc/hosts
-H 添加匹配行的文件名前缀,多个输入文件时为默认选项 grep -H 'root' /etc/passwd
-n number,添加行号前缀 grep -n 'root' /etc/passwd
-T table,多个前缀时,使用TAB进行对齐,前缀顺序:Hnb grep -THnb 'root' /etc/passwd
-Z zero,使用NUL字符分隔文件名,可结合-l使用 grep -Zl 'o' /etc/passwd /etc/hosts

2.4. 上下文行控制选项

选项 描述 示例
-A after,附带输出匹配行的前几行,和匹配行组合一个组 grep -A2 'root' /etc/passwd
-B before,附带输出匹配行的后几行 grep -B2 'root' /etc/passwd
-C context,附带输出匹配行的前后几行 grep -C2 'root' /etc/passwd
--group-separator 指定组的分隔符,默认为-- grep -C1 --group-separator='==SEP==' 'root' /etc/passwd
--no-group-separator 不使用组分隔符 grep -C1 --no-group-separator 'root' /etc/passwd

2.5. 文件和目录选项

选项 描述 示例
-r recursive,递归的读取目录下的所有文件 grep -r 'localhost' /etc
-R recursive,递归的读取目录下的所有文件,包括符号链接 grep -r 'localhost' /etc
--exclude 跳过匹配指定表达式的文件 grep -rl 'localhost' /etc --exclude='hosts*'
--exclude-from 从指定文件中读取要跳过的文件表达式`
--exclude-dir 跳过匹配指定表达式的目录 grep -rl 'localhost' /etc --exclude-dir='pki'

3. 正则表达式说明

grep中的正则表达式官方介绍: http://www.gnu.org/software/grep/manual/grep.html#Regular-Expressions

Published by

风君子

独自遨游何稽首 揭天掀地慰生平