grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。
egrep是grep的扩充版本,改良了grep不能或不方便的操作,主要是正则匹配方面的扩展。
fgrep不做正则处理,表达式仅作为一般字符串处理,所有正则元字符不起作用。
调用grep
一般的grep命令行是:grep options pattern input_file_names
可以有零个或多个options和input_file_names,可以用-e pattern
或-f file
选项来指定多个正则表达式。
grep 常用选项
-v
:逆反模式,只输出不匹配的行。-r
:递归搜索目录。-q
:静默模式,不输出任何结果(stderr除外,用于获取命令返回值,有匹配为true,否则为false)。-i
:忽略大小写区别。-w
:整个单词匹配。-n
:同时输出行号。-c
:只输出匹配的行数。-l
:只输出含有匹配行的文件名。-E
:切换到egrep。
举例
grep -l 'main' *.c
:在当前目录下的所有c源文件里搜索含有main
的文件,只输出文件名。
grep -r 'hello' /home/gigi
:递归地搜索目录。
find /home/gigi -name "*.c" -print0 | xargs -0r grep -H 'hello'
:在/home/gigi
目录下的所有c文件里搜索hello
,类似于:grep -rH --include='*.c' 'hello' /home/gigi
。
grep -e '--cut here--' *
:如果模式以-
开头,需要使用-e
选项,否则grep是尝试当作选项列表来解析。
grep -w 'hello' *
:搜索一个完整的单词,而不是作为单词的一部分。
grep -C 2 'hello' *
:输出匹配行的上下文,前后各2行。
grep -H 'eli' /etc/passwd /dev/null
:强制grep输出匹配行所在的文件名。
ps -ef | grep '[c]ron
:这里之所以要使用字符集[]
模式,是为了避免匹配到这条命令本身。
grep 'paul' /etc/motd | grep 'franc,ois'
:grep没法表示一个逻辑与的概念,如果需要同时匹配多个模式,需要使用多个grep命令。
cat /etc/passwd | grep 'alain' - /etc/motd
:同时在标准输入和输入文件里查找。-
表示标准输入。
echo -e "123321\nabcxyz\nabcba" | grep -e '\(.\)\(.\).\2\1'
:用正则表达式表示回文。能够匹配的回文多达19个字符:
echo "1234567890987654321" | grep -E -e '^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$'