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$'