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