grep命令使用

414 阅读3分钟

无论使用什么产品,照着使用指南进行一番操作是学习它最便捷快速的方法。使用指南都是给用户看的, 一般都是简单易懂,有示例。linux命令行也是一样。

linux 命令行的使用指南有两种方法查看, 一种是命令行后面添加 --help选项,查看最基础的使用概要。 另一种是使用man 命令查看详细的命令使用指南。第一种适合快捷查询,但是信息不够详细。 第二种,适合深入详细的查询,可以了解各个选项的意义。通过这两种方式基本上可以搞懂linux的命令使用,然后再结合网络上的一些博客、百科什么的示例,就基本可以掌握该linux命令了。对于不懂的概念,再深入扩展学习一下,再加上日积月累的使用,对该linux命令就可以更加熟练、信手拈来了。这个方法也是我学习的主要套路。不知道大家是否也一样?。

不唠叨了。今年还有一个todo是掌握linux命令三剑客grep/awk/sed,下面整理一下比较简单的grep命令使用(基本上就是手册的翻译及使用举例)。

grep

用于文件内容的模式匹配搜索

使用概要

     grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
          [-e pattern] [-f file] [--binary-files=value] [--color[=when]]
          [--colour[=when]] [--context[=num]] [--label] [--line-buffered]
          [--null] [pattern] [file ...]

grep会搜索给定的文件,获取符号指定匹配模式(pattern)的行并输出。默认的,pattern只会一行行的进行匹配,不包含结尾的换行。空的pattern则匹配每一行。

grep用来作简单的模式匹配和基础的正则表达式匹配。 egrep可以处理扩展的正则表达式。fgrep处理的效率比grep和egrep更好,但是只能处理固定的pattern。pattern可以包含多行。

zgrep, zegrep和zfgrep的功能和grep、egrep、fgrep的功能一样,但是处理之前会对文件进行解压, 也就是用来处理压缩文件的版本。

命令选项:

 -A num, 显示匹配行之后的num行

 -a, --text 把所有文件当作ASCII文本处理。

 -B num, 显示匹配行之前的num行

 -b , 显示匹配pattern的行首在文件的偏移

 -C 包含-A, -B的功能

 -c num 输出前面num行的匹配结果

 --colour=when   高亮匹配pattern的字符串, 可以为never, always 和 auto

 -D action , --devices=action 指定处理设备、FIFOs和sockets的动作。默认动作是`read`,当作普通文件进行匹配, 可以设置成`skip`,不作匹配

 -d action, --direcotries=action, 指定处理目录的动作, 默认动作是`read`, 当作普通文件进行匹配。可以设置成`skip`, 递归地进入处理,同`-R`/`-r`

 -E 指定扩展正则表达式, 作用同egrep

 -e pattern, --regexp=pattern 指定一个正则表达式, 一般使用-e来指定多个正则表达式, 只要匹配到任一正则表达式就会选中该行输出

 --exclude 如果指定了,那么符合给定pattern的文件名的文件将不会被查找。--exclude的优先级高于--include的优先级。pattern匹配的是全路径,不仅仅是文件名。
 		grep -i -e '^Hello*' -e '^aa'  -b --color --exclude hello.* *.md
 		grep keep$ grep -i -e '^Hello*' -e '^aa'  -b --color --exclude hello.* ./* -R

 --exclude-dir 如果指定了-R选项,那么就不会查找符合给定pattern的目录。--exclude-dir的优先级高于--include-dir

 -F, --fixed-strings 给定的pattern当作一个固定的字符串, 作用同fgrep

 -f file, --file=file 从file文件中读取多行的pattern。如果文件内容为空,将不匹配任何东西
 		grep -i -f pattern  -b --color --exclude '*.md'  -R './' --exclude-dir '2' 

 -G, --basic-regexp 给定的pattern当作基础的正则表达式。 

 -H 输出结果时,前面显示文件名

 -h, --no-filename 输出结果时,前面不显示文件名

 --help 显示帮助

 -I 忽略二进制文件, 就是不对二进制文件匹配处理

 -i, --ignore-case 对pattern忽略大小写

 --include 只有符合给定pattern的文件名的文件才进行搜索。pattern针对的是全路径,而不仅仅是文件名.
 	grep -i -f pattern  -b --color --include '*.md' ~/Documents/code/GitHub/blog_code/grep/* -R

 --include-dir 如果设置了`-R`,只有目录符合给定pattern的文件名的文件才进行搜索。

 -J, --bz2decompress 解压缩bzip2的文件再进行搜索

 -L, --files-without-match 只显示文件内容不符合pattern的, 文件名符合-L值的文件的文件名
 	grep -i 'hello' -L *.md ./ -r

 -l, --files-with-matches 只显示文件内容符合pattern的,文件名符合-l值的文件的文件名

 --mmap 使用mmap而不是read来读取输入的内容。可以获取更好的性能, 但有时候行为不确定。

 -m num, --max-count=num 获取num个结果后,不再读取文件

 -n, --line-number 输出结果显示行号

 --null Prints a zero-byte after the file name.

 -O 如果给定了-R选项, 而且命令行显式的写出了符号链接, 则进行处理, 否则跳过。 就不处理符号连接的内容

 -o 只显示匹配patter的部分。

 -p 如果给定了-R选项,默认不处理符号连接

 -q, --quiet, --silent 静默搜索,直到搜索到一个匹配的项,不会输出。 可以用在shell中, 仅仅判断有没有找到内容。

 -R, -r, --recursive  递归的查找子目录

 -S 如果指定了-R选项,所有符号连接都处理

 -s, --no-messages Silent mode . 不存在或者不可读的文件 信息不会被显示
 	grep -i 'hello' -n --mmap --null  *.json -s

 -U, --binary 搜索二进制文件,但是不打印结果

 -V, --version 显示grep的版本信息

 -v, --invert-match 显示不匹配pattern的行

 -w, --word-regexp pattern被当做一个word来匹配查询

 -x, --line-regexp 只有输入行全部匹配字符串或者regular expression才算匹配上

 -y, 同-i  废弃了

 -Z, -z, --decompress 先解压,动作同 zgrep

 --binary-files=value  value为binary, 则默认搜索二进制文件,但是不输出。value为without-match,则不处理二进制文件, 
  	value为text , 二进制文件当做text文件进行查找 输出

 --context=num 输出匹配行的前后num行内容, 和 -C 一样, 默认值为2

 --line-buffered 强制输出为line buffered, 默认标准输出为terminal时,使用line-buffered, 其他使用block buffered

 如果没有指定输入文件, 则输入为标准输入。

环境变量

GREP_OPTIONS 变量可以设置默认的选项

export GREP_OPTIONS='-i -n -H'


Keep:grep keep$ grep 'hello' hello.md 
hello.md:3:啊啊啊   Hello, World!!
hello.md:5:hello world
hello.md:7:helloool man.
hello.md:9:boy helloM
hello.md:15:heLLO+
Keep:grep keep$ 


命令退出值

grep命令执行完后,会根据不同情况返回不同的值。

0  有匹配的行
1  没有任何行匹配
>1  命令执行错误

示例

grep 'patricia' file_name

grep '^\.Pp' file_name // 查找以.Pp开头的行

grep -v -e 'foo' -e 'bar' filename // 查找没有foo和bar的行 -v 

egrep '19|20|25' file_name // 在文件中查找 19, 20, 25



标准

grep符合 IEEE Std 1003.1-2008 标准。

HISTORY

 The grep command first appeared in Version 6 AT&T UNIX.

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei

github博客: fishmwei.github.io/