Linux系统中,grep命令通常用来实现行的过滤。用法汇总如下。

一、使用方式

1、直接查询文件中的行:

    grep [OPTION]... PATTERN [FILE]...

2、用在管道符“|”后面,过滤来自标准输入的信息,例如:

    查询8000端口的TCP连接数:netstat -nat | grep -i "8000" | wc -l

    输出文件text.txt中以"2019"开头的行到text2.txt:cat text.txt | grep '^2019' > text2.txt

二、选项汇总

1、正则相关的选项

    正则相关的选项,指的是这些选项是作用于grep后面加的正则表达式的。包括:

  • -E, --extended-regexp     PATTERN is an extended regular expression (ERE):正则的类型是拓展的正则表达式
  • -F, --fixed-strings       PATTERN is a set of newline-separated fixed strings:正则是换行符分割的字符串集合
  • -G, --basic-regexp        PATTERN is a basic regular expression (BRE):正则的类型是普通的正则表达式(默认)
  • -P, --perl-regexp         PATTERN is a Perl regular expression:正则的类型是Perl正则表达式
  • -e, --regexp=PATTERN      use PATTERN for matching:使用参数后面的正则进行匹配
  • -f, --file=FILE           obtain PATTERN from FILE:从目标文件中获取正则进行匹配
  • -i, --ignore-case         ignore case distinctions:忽略大小写的不同
  • -w, --word-regexp         force PATTERN to match only whole words:全字符匹配,即目标行中匹配正则范本的必须是一个完整的词
  • -x, --line-regexp         force PATTERN to match only whole lines:整行匹配,要求目标行整行必须匹配正则范本
  • -z, --null-data           a data line ends in 0 byte, not newline:以字节0而不是换行符结尾的数据行

2、输出控制相关的选项

    输出控制相关的选项,指的是输出到目标的时候需要做的操作,包括:

  • -m, --max-count=NUM       stop after NUM matches:输出的最大行数
  • -b, --byte-offset         print the byte offset with output lines:每一行输出的时候,行前偏移的字节数
  • -n, --line-number         print line number with output lines:在输出行的前面输出行号
  •     --line-buffered       flush output on every line:每一行输出后都清除缓存
  • -H, --with-filename       print the file name for each match:在每一个匹配的行前打印文件名
  • -h, --no-filename         suppress the file name prefix on output:禁止输出文件名前缀。文件名前缀来源参考上面一条
  •     --label=LABEL         use LABEL as the standard input file name prefix:使用LABEL作为输出文件名的前缀
  • -o, --only-matching       show only the part of a line matching PATTERN:只显示行中匹配正则表达式的部分
  • -q, --quiet, --silent     suppress all normal output:禁止所有的正常输出
  •     --binary-files=TYPE   assume that binary files are TYPE:假定二进制文件的类型是TYPE
  •                           TYPE is 'binary', 'text', or 'without-match'
  • -a, --text                equivalent to --binary-files=text:等效于--binary-files=text
  • -I                        equivalent to --binary-files=without-match:等效于--binary-files=without-match
  • -d, --directories=ACTION  how to handle directories;
  •                           ACTION is 'read', 'recurse', or 'skip':如何处理目录
  • -D, --devices=ACTION      how to handle devices, FIFOs and socket;
  •                           ACTION is 'read' or 'skip':如何处理设备、管道流和套接字
  • -r, --recursive           like --directories=recurse:类似于--directories=recurse
  • -R, --dereference-recursive  likewise, but follow all symlinks:类似于'-r'与'-d recurse', 但是使用符号链接
  •     --include=FILE_PATTERN  search only files that match FILE_PATTERN:只搜索匹配FILE_PATTERN的文件
  •     --exclude=FILE_PATTERN  skip files and directories matching FILE_PATTERN:跳过匹配FILE_PATTERN的文件和目录
  •     --exclude-from=FILE   skip files matching any file pattern from FILE:跳过匹配任意FILE中包含的文件范式
  •     --exclude-dir=PATTERN  directories that match PATTERN will be skipped.:跳过匹配PATTERN的目录
  • -L, --files-without-match  print only names of FILEs containing no match:打印出文件内容出包含不符合文件范式的文件的文件名
  • -l, --files-with-matches  print only names of FILEs containing matches:打印出文件内容出包含符合文件范式的文件的文件名
  • -c, --count               print only a count of matching lines per FILE:计算每个文件中符合正则范式的的行数
  • -T, --initial-tab         make tabs line up (if needed):对齐标签
  • -Z, --null                print 0 byte after FILE name:在文件名后面输出字节0

3、上下文控制相关的选项

    上下文控制相关的一些选项,里面涉及到一些回车和换行符,不理解二者关系和在不同操作系统中使用情况的童鞋可以看这里:不同操作系统下的回车符和换行符

  • -B, --before-context=NUM  print NUM lines of leading context:打印内容包含匹配行前面的NUM行信息
  • -A, --after-context=NUM   print NUM lines of trailing context:打印内容包含匹配行后面的NUM行信息
  • -C, --context=NUM         print NUM lines of output context:打印内容包含匹配行前面和后面的NUM行信息
  • -NUM                      same as --context=NUM:类似于--context=NUM,即上面一条配置
  •     --color[=WHEN],
  •     --colour[=WHEN]       use markers to highlight the matching strings;:使用高亮来标记匹配的内容,
  •                           WHEN is 'always', 'never', or 'auto':WHEN指的是标记的时机,内容是'always', 'never', or 'auto'
  • -U, --binary              do not strip CR characters at EOL (MSDOS/Windows):不要在换行符中去掉回车符(用于MSDOS/Windows操作系统)
  • -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS/Windows):在忽略MSDOS/Windows操作系统中的回车符的前提下记录偏移量

4、其他选项

    还有一些很难被分类的选项,包括:

  •   -s, --no-messages         suppress error messages:禁用错误输出信息
  •   -v, --invert-match        select non-matching lines:选择不匹配的行
  •   -V, --version             print version information and exit:打印版本信息并退出
  •       --help                display this help and exit:显示grep的帮助文档并退出

三、常用用法

1、常用选项

    上面的选项非常多,但是其实常用的很少,主要包括下面这些:

    常用选项如下:

  • -a、--text :将二进制文件以文本文件的方式搜寻数据
  • -c 、--count:计算找到 '搜寻字符' 的次数
  • -i、--ignore-case、--binary-files=text:忽略大小写的不同,所以大小写视为相同
  • -n、--line-number:number,顺便输出行号
  • -v 、--invert-match:反向选择,亦即显示出没有 '搜寻字符' 内容的那一行
  • --binary-files=TYPE:假定二进制文件是TYPE格式的,TYPE包括:'binary', 'text', or 'without-match'
  • --color=auto :可以将找到的关键词部分加上颜色的显示
  • -m, --max-count=NUM:输出的最大行数
  • -A:
  • -B:
  • -C:

2、过滤多个关键字:“与”和“或”

1、“与”操作

    与逻辑可以通过增加管道流操作来实现。例如如果需要打印出文件test.txt中匹配同时包含“abc"和"123"的行,可以用如下方式:

cat test.txt | grep "abc" | grep "123"

2、“或”操作

    或逻辑可以通过修改正则表达式来实现。例如例如如果需要打印出文件test.txt中匹配包含“abc"或者包含"123"的行,可以用如下方式:

cat test.txt | grep "abc|123"

3、单引号和双引号

    双引号:双引号是部分引用,如果引号中包含命令会先解析出来,例如"$num",会去解析遍历num的值。

    单引号:单引号是全部引用,即引号中包含什么就作为什么字符串,例如'$num',会当做字符串内容为$num四个字符的字符串来处理。

四、常用语法总结(持续更新)

    这里总结一些平时用到的有趣的例子,持续更新。

  1. 过滤以“abc”开头的行:grep "^abc"
  2. 过滤不包含"abc"的行:grep -v "abc"
  3. 过滤包含"abc"的行并查看最后两行:grep "adb" | tail -n 2
  4. 过滤包含"abc"的行并查看最前面一行:grep -m 1  "adb"
  5. 过滤包含"abc"的行并查看第一项(和上面的区别是,如果如果第一行有多个匹配项,上面会显示整行,这里只会显示第一行的第一项):grep -m 1  "adb"  |  head 1
  6. 过滤包含"abc"的行并显示前面两行和后面三行:grep -B2 -A3 "adb"
  7. 过滤包含"abc"的行并显示前面两行和后面两行:grep -C2 "adb"