grep 命令

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

继续阅读