1 | grep
|
2 | ===
|
3 |
|
4 | 强大的文本搜索工具
|
5 |
|
6 | ## 补充说明
|
7 |
|
8 | **grep** (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用,使用上十分灵活。
|
9 |
|
10 | ### 选项
|
11 |
|
12 | ```shell
|
13 | -a --text # 不要忽略二进制数据。
|
14 | -A <显示行数> --after-context=<显示行数> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
|
15 | -b --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。
|
16 | -B<显示行数> --before-context=<显示行数> # 除了显示符合样式的那一行之外,并显示该行之前的内容。
|
17 | -c --count # 计算符合范本样式的列数。
|
18 | -C<显示行数> --context=<显示行数>或-<显示行数> # 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
|
19 | -d<进行动作> --directories=<动作> # 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
|
20 | -e<范本样式> --regexp=<范本样式> # 指定字符串作为查找文件内容的范本样式。
|
21 | -E --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
|
22 | -f<范本文件> --file=<规则文件> # 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
|
23 | -F --fixed-regexp # 将范本样式视为固定字符串的列表。
|
24 | -G --basic-regexp # 将范本样式视为普通的表示法来使用。
|
25 | -h --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
|
26 | -H --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。
|
27 | -i --ignore-case # 忽略字符大小写的差别。
|
28 | -l --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。
|
29 | -L --files-without-match # 列出文件内容不符合指定的范本样式的文件名称。
|
30 | -n --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。
|
31 | -P --perl-regexp # PATTERN 是一个 Perl 正则表达式
|
32 | -q --quiet或--silent # 不显示任何信息。
|
33 | -R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
|
34 | -s --no-messages # 不显示错误信息。
|
35 | -v --revert-match # 反转查找。
|
36 | -V --version # 显示版本信息。
|
37 | -w --word-regexp # 只显示全字符合的列。
|
38 | -x --line-regexp # 只显示全列符合的列。
|
39 | -y # 此参数效果跟“-i”相同。
|
40 | -o # 只输出文件中匹配到的部分。
|
41 | -m <num> --max-count=<num> # 找到num行结果后停止查找,用来限制匹配行数
|
42 | ```
|
43 |
|
44 | ### 规则表达式
|
45 |
|
46 | ```shell
|
47 | ^ # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。
|
48 | $ # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
|
49 | . # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
|
50 | * # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
|
51 | .* # 一起用代表任意字符。
|
52 | [] # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
|
53 | [^] # 匹配一个不在指定范围内的字符,如:'[^A-Z]rep' 匹配不包含 A-Z 中的字母开头,紧跟 rep 的行
|
54 | \(..\) # 标记匹配字符,如'\(love\)',love被标记为1。
|
55 | \< # 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
|
56 | \> # 锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
|
57 | x\{m\} # 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
|
58 | x\{m,\} # 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
|
59 | x\{m,n\} # 重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
|
60 | \w # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
|
61 | \W # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
|
62 | \b # 单词锁定符,如: '\bgrep\b'只匹配grep。
|
63 | ```
|
64 |
|
65 | ## grep命令常见用法
|
66 |
|
67 | 在文件中搜索一个单词,命令会返回一个包含 **“match_pattern”** 的文本行:
|
68 |
|
69 | ```shell
|
70 | grep match_pattern file_name
|
71 | grep "match_pattern" file_name
|
72 | ```
|
73 |
|
74 | 在多个文件中查找:
|
75 |
|
76 | ```shell
|
77 | grep "match_pattern" file_1 file_2 file_3 ...
|
78 | ```
|
79 |
|
80 | 输出除之外的所有行 **-v** 选项:
|
81 |
|
82 | ```shell
|
83 | grep -v "match_pattern" file_name
|
84 | ```
|
85 |
|
86 | 标记匹配颜色 **--color=auto** 选项:
|
87 |
|
88 | ```shell
|
89 | grep "match_pattern" file_name --color=auto
|
90 | ```
|
91 |
|
92 | 使用正则表达式 **-E** 选项:
|
93 |
|
94 | ```shell
|
95 | grep -E "[1-9]+"
|
96 | # 或
|
97 | egrep "[1-9]+"
|
98 | ```
|
99 | 使用正则表达式 **-P** 选项:
|
100 |
|
101 | ```shell
|
102 | grep -P "(\d{3}\-){2}\d{4}" file_name
|
103 | ```
|
104 |
|
105 |
|
106 | 只输出文件中匹配到的部分 **-o** 选项:
|
107 |
|
108 | ```shell
|
109 | echo this is a test line. | grep -o -E "[a-z]+\."
|
110 | line.
|
111 |
|
112 | echo this is a test line. | egrep -o "[a-z]+\."
|
113 | line.
|
114 | ```
|
115 |
|
116 | 统计文件或者文本中包含匹配字符串的行数 **-c** 选项:
|
117 |
|
118 | ```shell
|
119 | grep -c "text" file_name
|
120 | ```
|
121 |
|
122 | 搜索命令行历史记录中 输入过 `git` 命令的记录:
|
123 |
|
124 | ```shell
|
125 | history | grep git
|
126 | ```
|
127 |
|
128 | 输出包含匹配字符串的行数 **-n** 选项:
|
129 |
|
130 | ```shell
|
131 | grep "text" -n file_name
|
132 | # 或
|
133 | cat file_name | grep "text" -n
|
134 |
|
135 | #多个文件
|
136 | grep "text" -n file_1 file_2
|
137 | ```
|
138 |
|
139 | 打印样式匹配所位于的字符或字节偏移:
|
140 |
|
141 | ```shell
|
142 | echo gun is not unix | grep -b -o "not"
|
143 | 7:not
|
144 | #一行中字符串的字符偏移是从该行的第一个字符开始计算,起始值为0。选项 **-b -o** 一般总是配合使用。
|
145 | ```
|
146 |
|
147 | 搜索多个文件并查找匹配文本在哪些文件中:
|
148 |
|
149 | ```shell
|
150 | grep -l "text" file1 file2 file3...
|
151 | ```
|
152 |
|
153 | ### grep递归搜索文件
|
154 |
|
155 | 在多级目录中对文本进行递归搜索:
|
156 |
|
157 | ```shell
|
158 | grep "text" . -r -n
|
159 | # .表示当前目录。
|
160 | ```
|
161 |
|
162 | 忽略匹配样式中的字符大小写:
|
163 |
|
164 | ```shell
|
165 | echo "hello world" | grep -i "HELLO"
|
166 | # hello
|
167 | ```
|
168 |
|
169 | 选项 **-e** 制动多个匹配样式:
|
170 |
|
171 | ```shell
|
172 | echo this is a text line | grep -e "is" -e "line" -o
|
173 | is
|
174 | is
|
175 | line
|
176 |
|
177 | #也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
|
178 | cat patfile
|
179 | aaa
|
180 | bbb
|
181 |
|
182 | echo aaa bbb ccc ddd eee | grep -f patfile -o
|
183 | ```
|
184 |
|
185 | 在grep搜索结果中包括或者排除指定文件:
|
186 |
|
187 | ```shell
|
188 | # 只在目录中所有的.php和.html文件中递归搜索字符"main()"
|
189 | grep "main()" . -r --include *.{php,html}
|
190 |
|
191 | # 在搜索结果中排除所有README文件
|
192 | grep "main()" . -r --exclude "README"
|
193 |
|
194 | # 在搜索结果中排除filelist文件列表里的文件
|
195 | grep "main()" . -r --exclude-from filelist
|
196 |
|
197 | ```
|
198 |
|
199 | 使用0值字节后缀的grep与xargs:
|
200 |
|
201 | ```shell
|
202 | # 测试文件:
|
203 | echo "aaa" > file1
|
204 | echo "bbb" > file2
|
205 | echo "aaa" > file3
|
206 |
|
207 | grep "aaa" file* -lZ | xargs -0 rm
|
208 |
|
209 | # 执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。
|
210 | ```
|
211 |
|
212 | grep静默输出:
|
213 |
|
214 | ```shell
|
215 | grep -q "test" filename
|
216 | # 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。
|
217 | ```
|
218 |
|
219 | 打印出匹配文本之前或者之后的行:
|
220 |
|
221 | ```shell
|
222 | # 显示匹配某个结果之后的3行,使用 -A 选项:
|
223 | seq 10 | grep "5" -A 3
|
224 | 5
|
225 | 6
|
226 | 7
|
227 | 8
|
228 |
|
229 | # 显示匹配某个结果之前的3行,使用 -B 选项:
|
230 | seq 10 | grep "5" -B 3
|
231 | 2
|
232 | 3
|
233 | 4
|
234 | 5
|
235 |
|
236 | # 显示匹配某个结果的前三行和后三行,使用 -C 选项:
|
237 | seq 10 | grep "5" -C 3
|
238 | 2
|
239 | 3
|
240 | 4
|
241 | 5
|
242 | 6
|
243 | 7
|
244 | 8
|
245 |
|
246 | # 如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
|
247 | echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
|
248 | a
|
249 | b
|
250 | --
|
251 | a
|
252 | b
|
253 | ```
|
254 |
|
255 |
|
256 |
|