0%

grep命令使用

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

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

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

grep

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

使用概要

1
2
3
4
5
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的功能一样,但是处理之前会对文件进行解压, 也就是用来处理压缩文件的版本。

命令选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
-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 变量可以设置默认的选项

1
2
3
4
5
6
7
8
9
10
11
12
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  命令执行错误

示例

1
2
3
4
5
6
7
8
9
10
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 -E '[0-9]\{1,3\}' sed.md --color

标准

grep符合 IEEE Std 1003.1-2008 标准。

HISTORY

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

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。