grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
1. 语法
grep [options] pattern [files]
或
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
- pattern - 表示要查找的字符串或正则表达式。
- files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。
2. 选项:
-a 或 --text : | 不要忽略二进制的数据。 | |
-A<显示行数> 或 | 除了显示符合范本样式的那一列之外,并显示该行之后几行的内容。 | ]# echo -e "A\nB\nC\nD\nE"|grep -A1 C C D |
-b 或 --byte-offset : | 在显示符合样式的那一行之前,标示出该行第一个字符的编号 | ]# echo -e "123\n456\n789"|grep -b 5 4:456 |
-B<显示行数> 或 --before-context=<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前的内容。 | ]# echo -e "A\nB\nC\nD\nE"|grep -B1 C B C |
-c 或 --count : | 计算共有多少个匹配结果 | ]# echo -e "A\nBB\nCB\nDCB\nE"|grep -c B 3 |
-C<显示行数> 或 --context=<显示行数>或 -<显示行数> : | 除了显示符合样式的那一行之外,并显示该行之前后的内容。 | echo -e "A\nB\nC\nD\nE\nF\nG"|grep -C2 C A B C D E |
-d <动作> 或 | 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。 -d recurse 递归到文件夹里的文件查询 | ]# grep -d recurse bin * 1/1.sh:/bin/bash 2.sh:/bin/bash ]# grep -d skip bin * 2.sh:/bin/bash ]# grep -d read bin * grep: 1: Is a directory 2.sh:/bin/bash |
-e<范本样式> 或 --regexp=<范本样式> | 支持正则表达式匹配,支持多个-e | echo -e "123\nabc\nABC"|grep -e '1' -e 'a' 123 abc |
-E 或 --extended-regexp | 支持用扩展正则来进行匹配 | echo -e "123\nabc\nABC"|grep -E '[a-z]' abc |
-f<规则文件> 或 --file=<规则文件> | 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。 | cat patfile aaa bbb ]# echo aaa bbb ccc ddd eee | grep -f patfile -o aaa bbb |
-F 或 --fixed-regexp | 不支持正则表达式,将模式按照字面意思匹配 和fgrep效果一样 | ]# echo -e "bbbcd\naa" | grep -F "aa" aa ]# echo -e "bbaabcd\naa" | grep -F "[a-z]" 无结果 |
-G 或 --basic-regexp : | 基本正则 | ]# echo -e "bbaabcd\naa" | grep -G "[a-z]" bbaabcd aa |
-h 或 --no-filename : | 在显示符合样式的那一行之前,不标示该行所属的文件名称。 | ]# grep -r bin * 1/1.sh:/bin/bash 2.sh:/bin/bash ]# grep -r bin * -h /bin/bash /bin/bash |
-H 或 --with-filename : | 在显示符合样式的那一行之前,表示该行所属的文件名称。 | ]# grep bin *.sh /bin/bash ]# grep bin *.sh -H 2.sh:/bin/bash |
-i 或 -ignore-case | 忽略字符大小写的差别。 | ]# echo -e "abc\nABC"|grep 'a' -i abc ABC |
-l 或 --file-with-matches : | 只打印匹配的文件名。 | ]# grep "/bin" *.sh -l 2.sh |
-L 或 --files-without-match | 列出文件内容不符合指定的样式的文件名称 | ]# grep bins *.sh -L 2.sh |
-n 或 --line-number | 在显示符合样式的那一行之前,标示行号。 | ]# grep sh *.sh -n 1:/bin/bash 2:bash 3:sh |
-o 或 --only-matching | 只显示匹配PATTERN 部分。 可用于统计某个字符或字符串在文件中出现的次数 | grep -o "bash" /etc/passwd|wc -l 8 #grep -o '.' /etc/passwd|sort|uniq -c|sort -nr #grep -o '[^,. ]*' patfile|sort|uniq -c|sort -nr |
-q 或 --quiet或 --silent | 不显示任何信息,可以通过判断返回值来确定是否有匹配到结果 | ]# grep called patfile -q ]# echo $? 0 |
-r 或 --recursive : | 递归查找子目录中的文件。 | ]# grep -r bin * 1/1.sh:/bin/bash 2.sh:/bin/bash |
-s 或 --no-messages | 不显示错误信息。 | ]# grep bin * grep: 1: Is a directory 2.sh:/bin/bash ]# grep bin * -s 2.sh:/bin/bash |
-v 或 --invert-match | 反向查找,只打印不匹配的行 | ]# echo -e "1234\n345\n567"|grep -v 345 1234 567 |
-V 或 --version | 显示版本信息。 | ]# grep -V grep (GNU grep) 2.20 |
-w 或 --word-regexp | 只显示全字符合的列。 | ]# echo -e "1234\n234\n567"|grep -w 234 234 |
-x 或 --line-regexp : | 只显示全列符合的列。 | ]# echo -e "1234\n234 33\n567"|grep -x 234 无结果 ]# echo -e "1234\n234 33\n567"|grep -x "234 33" 234 33 |
-y | 忽略大小写,同-i | ]# echo -e 'Ab\nab'|grep -y a Ab ab |
3. 实例
1、在文件 file.txt 中查找字符串 "hello",并打印匹配的行:
grep hello file.txt
2、在文件夹 dir 中递归查找所有文件中匹配正则表达式 "pattern" 的行,并打印匹配行所在的文件名和行号:
grep -r -n pattern dir/
3、在标准输入中查找字符串 "world",并只打印匹配的行数:
echo "hello world" | grep -c world
4、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
5、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi
6、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test *test*
7.统计test.txt文件中出现的字符以及字符串出现的次数,并排序
#grep -o '.' test.txt|sort|uniq -c|sort -nr
统计每个字符出现的次数
#grep -o '[^,. ]*' test.txt|sort|uniq -c|sort -nr
统计每个单词出现的次数