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四个字符的字符串来处理。
四、常用语法总结(持续更新)
这里总结一些平时用到的有趣的例子,持续更新。
- 过滤以“abc”开头的行:grep "^abc"
- 过滤不包含"abc"的行:grep -v "abc"
- 过滤包含"abc"的行并查看最后两行:grep "adb" | tail -n 2
- 过滤包含"abc"的行并查看最前面一行:grep -m 1 "adb"
- 过滤包含"abc"的行并查看第一项(和上面的区别是,如果如果第一行有多个匹配项,上面会显示整行,这里只会显示第一行的第一项):grep -m 1 "adb" | head 1
- 过滤包含"abc"的行并显示前面两行和后面三行:grep -B2 -A3 "adb"
- 过滤包含"abc"的行并显示前面两行和后面两行:grep -C2 "adb"