Linux grep command

作用

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

语法及选项

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
[root@hadoop-centos-01 ~]# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c

Regexp selection and interpretation:
-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
-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

Miscellaneous:
-s, --no-messages suppress error messages
-v, --invert-match select non-matching lines
-V, --version display version information and exit
--help display this help text and exit

Output control:
-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
-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 is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
-I equivalent to --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 sockets;
ACTION is 'read' or 'skip'
-r, --recursive like --directories=recurse
-R, --dereference-recursive
likewise, but follow all symlinks
--include=FILE_PATTERN
search only files that match FILE_PATTERN
--exclude=FILE_PATTERN
skip files and directories matching FILE_PATTERN
--exclude-from=FILE skip files matching any file pattern from FILE
--exclude-dir=PATTERN directories that match PATTERN will be skipped.
-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

Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM
--group-separator=SEP use SEP as a group separator
--no-group-separator use empty string as a group separator
--color[=WHEN],
--colour[=WHEN] use markers to highlight the matching strings;
WHEN is 'always', 'never', or 'auto'
-U, --binary do not strip CR characters at EOL (MSDOS/Windows)
-u, --unix-byte-offsets report offsets as if CRs were not there
(MSDOS/Windows)

-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。

常见用法

搜索文件中包含 match_pattern 的文本行

语法

1
2
3
4
grep match_pattern file_name1 fie_name2 ...
grep "match_pattern" file_name1 fie_name2 ...

注:match_pattern中若有空格等,请将其用双引号("")括起来,匹配文件可以是多个,中间用空格分开

示例

1
2
3
[root@hadoop-centos-01 ~]# grep "bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
hadoop:x:1000:1000:hadoop:/home/hadoop:/bin/bash

输出除匹配之外的所有行 -v 选项

1
2
3
4
5
6
7
8
[root@hadoop-centos-01 test]# grep -v "bin/bash" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...

标记匹配颜色 –color=auto 选项

1
grep "match_pattern" file_name --color=auto

使用正则表达式 -E 选项

1
2
3
grep -E "[1-9]+"

egrep "[1-9]+"
1
2
3
4
5
6
7
[root@hadoop-centos-01 test]# echo this is a test line. | grep -o -E "[a-z]+\."
line.

[root@hadoop-centos-01 test]# echo this is a test line. | egrep -o "[a-z]+\."
line.

注: -o 选项只输出文件中匹配到的部分

统计文件或者文本中包含匹配字符串的总行数 -c 选项

1
grep -c "text" file_name
1
2
[root@hadoop-centos-01 test]# grep -c 'bin/bash' /etc/passwd
2

输出包含匹配字符串的行数 -n 选项:

1
2
3
4
5
6
grep "text" -n file_name

cat file_name | grep "text" -n

#多个文件
grep "text" -n file_1 file_2
1
2
3
[root@hadoop-centos-01 test]# grep -n 'bin/bash' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
43:hadoop:x:1000:1000:hadoop:/home/hadoop:/bin/bash

打印样式匹配所位于的字符或字节偏移

1
2
3
4
5
6
[root@hadoop-centos-01 test]# echo gun is not unix | grep -b -o "not"
7:not

注:一行中字符串的字符是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-o 只输出文件中匹配到的部分。

搜索多个文件并查找匹配文本在哪些文件中

1
grep -l "text" file1 file2 file3...

grep递归搜索文件

在多级目录中对文本进行递归搜索

1
grep "text" . -r -n  # .表示当前目录。
1
2
3
4
[root@hadoop-centos-01 test]# grep love . -r -n
./ts.txt:1:He likes his lover
./ts.txt:2:He loves his lover
./ts.txt:4:She loves her liker

忽略匹配样式中的字符大小写

1
2
[root@hadoop-centos-01 test]# echo "hello world" | grep -i "HELLO"
hello world

选项 -e 进行多个匹配样式

1
2
3
4
5
6
7
[root@hadoop-centos-01 test]# echo this is a text line | grep -e "is" -e "line" -o
is
is
line

[root@hadoop-centos-01 test]# echo this is a text line | grep -e "is" -e "line" -n
1:this is a text line

在grep搜索结果中包括或者排除指定文件

1
2
3
4
5
6
7
8
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}

#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"

#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist

Reference

https://man.linuxde.net/grep

-------------本文结束感谢您的阅读-------------