Linux文本文件处理(2)

本文主要介绍grep命令的用法。

1. grep的简介

文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行。配合正则表达式的使用可以实现强大的文本处理。

2. 基础用法

1
2
3
4
5
6
7
# grep [-cinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# grep root /etc/passwd
# grep -n root /etc/passwd -n:输出行号
# grep -c "bash" /etc/passwd -c:个数
# grep -v root /etc/passwd -v:反向匹配
# echo "hello world" | grep -i "HELLO" -i:忽略大小写
# dmesg | grep -n --color=auto 'eth' --color颜色高亮
# dmesg | grep -n -A3 -B2 --color=auto 'eth' 将匹配到的那一行的前面后面的行显示出来
# cat patfile
bash
nologin
# grep -f patfile /etc/passwd --color -f:文件
# grep "root" / -r --color=auto -r:递归
# grep "main()" . -r --include *.{php,html} --include:包含
# grep "main()" . -r --exclude "README" --exclude:不包含
# grep "main()" . -r --exclude-from filelist

3. 正则表达式

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
.						单个字符
^ 开始
$ 结尾
* 匹配零个或多个先前字符
[] 匹配一个指定范围内的字符
[^] 匹配一个不在指定范围内的字符
x\{m\} 重复字符x,m次,如:'0\{5\}'匹配包含5个o的行
x\{m,\} 重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行
w 匹配文字和数字字符,也就是[A-Za-z0-9]
W w的反置形式,匹配一个或多个非单词字符,如点号句号等
+ 匹配一个或多个先前的字符
? 匹配零个或多个先前的字符
a|b|c 匹配a或b或c
x{m},x{m,},x{m,n} 作用同x\{m\},x\{m,\},x\{m,n\}

[:alnum:] 文字数字字符
[:alpha:] 文字字符
[:digit:] 数字字符
[:graph:] 非空字符(非空格、控制字符)
[:lower:] 小写字符
[:cntrl:] 控制字符
[:print:] 非空字符(包括空格)
[:punct:] 标点符号
[:space:] 所有空白字符(新行,空格,制表符)
[:upper:] 大写字符
[:xdigit:] 十六进制数字(0-9,a-f,A-F)

示例:

1
2
3
4
5
6
7
8
9
10
11
# grep -E 'r..t' /etc/passwd --color
# grep -E 'r.*t' /etc/passwd --color
# grep -E 'r.+t' /etc/passwd --color
# cat /etc/httpd/conf/httpd.conf | grep -v '^#' | grep -v '^$'
# cat /etc/httpd/conf/httpd.conf | grep -v -e '^#' -e '^$'
# cat /etc/httpd/conf/httpd.conf | grep -v -E '#|^$'
# grep -E '[io]n' /etc/passwd --color
# grep -E '[^io]n' /etc/passwd --color
# grep 'ro\{2\}' /etc/passwd --color 不要加-E
# grep 'ro\{1,\}' /etc/passwd --color 贪婪模式,尽可能多的匹配
# grep 'ro\{1,3\}' /etc/passwd --color 至少1次,最多3次
---------------- The End ----------------