文本处理三剑客之grep

文本搜索工具,对目标文本逐行进行匹配检查,打印匹配的行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
grep [OPTION]... PATTERN [FILE]...

-m n # 匹配n次后停止
-v # 对匹配的内容取反
-i # 忽略大小写
-n # 显示匹配内容的行号
-c # 统计匹配的行号
-o # 仅显示匹配的内容,而不是整行
-q # 静默模式,不输出任何信息
-A n # after,匹配到的每行,再向下多匹配n行
-B n # before,匹配到的每行,再向上多匹配n行
-C n # context,匹配到的行,再向上和向下各多匹配n行
-e # 当搜索条件有多个时,使用-e,多个搜索条件之间是或关系
-w # 匹配整个单词,例如我想匹配root,不加-w会匹配到rooter,加-w就不会出现这种情况
- -E # 相当于egrep
- -F # 支持正则表达式,相当于fgrep
-f file # 搜索条件可以写在文件中,每行是一个搜索条件,多个搜索条件之间是或的关系
- -r # 递归目录,但不处理软链接
- -R # 递归目录,处理软件链接

-e 示例:

1
2
3
lujinkai@Z510:~/data/test$ grep -e 'root' -e 'ljk' passwd
root:x:0:0:root:/root:/bin/bash
ljk:x:1001:1001::/home/ljk:/bin/bash

-w 示例:

-f file 示例:

1
2
3
4
5
lujinkai@Z510:~/data/test$ echo '^root' > re.txt
lujinkai@Z510:~/data/test$ cat re.txt
^root
lujinkai@Z510:~/data/test$ grep -f re.txt passwd
root:x:0:0:root:/root:/bin/bash

练习

1.取两个文件的相同行

1
2
# 思路:使用-f参数,将第一个文件作为搜索条件
grep -f f1.txt f2.txt

2.分区利用率最大的值

1
df -h | grep '^/dev/sd' | grep -Eo '[0-9]{,3}%' | tr -d % | sort -nr | head -n1

2.哪个 IP 和当前主机连接数最多的前三位

1

3.连接状态的统计

1

4.算出所有人的年龄总和

1
2
3
4
5
6
lujinkai@Z510:~/data/test$ cat age.txt
xiaoming=20
xiaohong=18
xiaoqiang=22

lujinkai@Z510:~/data/test$ grep -Eo '[0-9]{,2}' age.txt | paste -s -d+ | bc