Grep

Grep家族

  • grep
  • egrep
  • fgrep

基础部分

常用选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-E :开启扩展(Extend)的正则表达式。

-i :忽略大小写(ignore case)。

-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。

-n :显示行号

-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker

-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。

-o :只显示被模式匹配到的字符串。

--color :将匹配到的内容以颜色高亮显示。

-A n:显示匹配到的字符串所在的行及其后n行,after

-B n:显示匹配到的字符串所在的行及其前n行,before

-C n:显示匹配到的字符串所在的行及其前后各n行,context

操作演示

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
# 过滤出包含root的内容
[root@ansible-server ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# -i不区分大小过滤root
[root@ansible-server ~]# grep -i "root" /etc/ssh/sshd_config
PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
#ChrootDirectory none

# 过滤出相关内容并显示行号
[root@ansible-server ~]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

# 显示排除匹配到root后还有多少行
[root@ansible-server ~]# grep -vc "root" /etc/passwd
40

# 只显示被匹配到的字符串
[root@ansible-server ~]# grep -o "root" /etc/passwd
root
root
root
root

# 显示匹配到整个单词的字符串
[root@ansible-server ~]# grep -w "sh" /etc/passwd
[root@ansible-server ~]# grep -w "bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
insocoper:x:1000:1000:insocoper:/home/insocoper:/bin/bash

Sed

sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过

sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。

常用选项

1
2
3
4
5
6
7
8
9
-r:使用扩展正则表达式

-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项

-f:后跟保存了sed指令的文件

-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改

-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

操作演示

向文件中添加或插入行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 向第三行后面添加hello,3a表示行号
sed '3ahello' 1.txt

# 向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加
sed '/123/ahello' 1.txt

# 在最后一行添加hello
sed '$ahello' 1.txt

# 在第三行之前插入hello
sed '3ihello' 1.txt

# 在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello
sed '/123/ihello' 1.txt

# 在最后一行之前插入hello
sed '$ihello' 1.txt

# 匹配行前加
sed -i '/www.baidu.com/i\www.qq.com' domain.file

# 匹配行后加
sed -i '/www.baidu.com/a\www.qq.com' domain.file

更改文件中指定的行

1
2
3
4
5
6
7
8
# 将文件1.txt的第一行替换为hello
sed '1chello' 1.txt

# 将包含123的行替换为hello
sed '/123/chello' 1.txt

# 将最后一行替换为hello
sed '$chello' 1.txt

删除文件中的行

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
# 删除第四行
sed '4d' 1.txt

# 从第一行开始删除,每隔2行就删掉一行,即删除奇数行
sed '1~2d' 1.txt

# 删除1~2行
sed '1,2d' 1.txt

# 删除1~2行之外的所有行
sed '1,2!d' 1.txt

# 删除最后一行
sed '$d' 1.txt

# 删除匹配123的行
sed '/123/d' 1.txt

# 删除从匹配123的行到最后一行
sed '/123/,$d' 1.txt

# 删除匹配123的行及其后面一行
sed '/123/,+1d' 1.txt

# 删除空行
sed '/^$/d' 1.txt

替换文件中的内容

1
2
3
4
5
6
7
8
# 将文件中的123替换为hello,默认只替换每行第一个123
sed -i 's/123/hello/' 1.txt

# 将文本中所有的123都替换为hello
sed -i 's/123/hello/g' 1.txt

# 将每行中第二个匹配的123替换为hello
sed -i 's/123/hello/2' 1.txt

打印文件中的行

1
2
3
4
5
6
7
8
9
10
11
# 打印文件中的第三行内容
sed -n '3p' 1.txt

# 打印1到3行
sed -n '1,3p' 1.txt

# 打印文件的最后一行
sed -n '$p' 1.txt

# 打印从第3行到最后一行的内容
sed -n '3,$p' 1.txt

删除文件中的空白行

1
sed -i "/^$/d" $1

Awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具,之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符

选项:

  • -F:分割
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
[root@ansible-server ~]# cat a.txt 
/dev/sdb1 /data1 ext4 defaults 0 0
/dev/sdc1 /data2 ext4 defaults 0 0
/dev/sdd1 /data3 ext4 defaults 0 0
/dev/sde1 /data4 ext4 defaults 0 0
/dev/sdf1 /data5 ext4 defaults 0 0
/dev/sdg1 /data6 ext4 defaults 0 0

# 显示第一列
[root@ansible-server ~]# cat a.txt | awk '{print $1}'
/dev/sdb1
/dev/sdc1
/dev/sdd1
/dev/sde1
/dev/sdf1
/dev/sdg1

# 显示第一列和第二列
[root@ansible-server ~]# cat a.txt | awk '{print $1,$2}'
/dev/sdb1 /data1
/dev/sdc1 /data2
/dev/sdd1 /data3
/dev/sde1 /data4
/dev/sdf1 /data5
/dev/sdg1 /data6

# 显示最后一列
[root@ansible-server ~]# cat a.txt | awk '{print $(NF)}'
0
0
0
0
0
0

# 显示倒数第三列
[root@ansible-server ~]# cat a.txt | awk '{print $(NF -2)}'
defaults
defaults
defaults
defaults
defaults
defaults

# 以/号分割,显示第二列
[root@ansible-server ~]# cat a.txt | awk -F '/' '{print $2}'
dev
dev
dev
dev
dev
dev