Linux三剑客

Linux三剑客

sed 取行和替换 修改文本

选项

1
2
3
-i :直接修改文件内容;
-n :只打印模式匹配的行;
-e 多次编辑

参数

1
2
3
4
5
6
7
8
9
10
11
a\ 在当前行下面插入文本;  
sed '1a test' 1.txt
i\ 在当前行上面插入文本;
sed '1i test' 1.txt
c\ 把选定的行改为新的文本;
sed '1c test' 1.txt
d 删除,删除选择的行;
sed '1d' 1.txt
s 替换指定字符;
sed 's/test/test2/' 1.txt # 替换一次
# s/查找的内容/替换的内容/g s表示替换 g表示全局,///可以替换成###,@@@,只要可以分割即可//之间实际上是正则表达式

替换标记

1
2
3
g 表示行内全面替换;  
sed 's/test/test2/g' 1.txt # 替换全部
p 表示打印行;

元字符集

1
2
3
4
5
6
^ #匹配行开始,如:/^sed/匹配所有以sed开头的行;
$ #匹配行结束,如:/sed$/匹配所有以sed结尾的行;
. #匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
* #匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行;
[] #匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
[^] #匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;

awk 取列 处理文本

awk完整语法

1
awk 'BEGIN {commands} pattern {commands} END{commands}' file1

BEGIN:处理数据前执行的命令
END:处理数据后执行的命令
pattern:模式,每一行都执行的命令
BEGIN和END里的命令只是执行一次
pattern里的命令会匹配每一行去处理

预定义变量

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
71
$0	: 代表当前行(相当于匹配所有)
awk -F: '{print $0, "---"}' /etc/passwd


$n : 代表第n列

案例1:(以:为分隔符)

awk -F: '{print $1}' /etc/passwd
root
daemon


NF : 记录当前统计总字段数

案例1:(以:为分隔符 统计文件内每行内的字段数)

awk -F: '{print NF}' /etc/passwd

案例2:(以:为分隔符 打印最后的字段)

awk -F: '{print $NF}' /etc/passwd




NR : 用来记录行号

案例1:

awk -F: '{print NR}' /etc/passwd




FS : 指定文本内容分隔符(默认是空格)

案例1:

awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd

解析:

BEGIN{FS=":"} : 相当于指定以 : 为分隔符

$NF : 存储以 : 分隔符的最后一列

$1 : 存储以 : 分隔符的第一列

print : 打印


OFS : 指定打印分隔符(默认空格)

案例1:(输出的意思 分隔符会打印出来)

awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd

FS 的优先级要高于 -F

解析:

BEGIN{OFS=" >>> "} : 指定打印分隔符

$NF : 存储以 >>> 分隔符的最后一列

$1 : 存储以 >>> 分隔符的第一列

print : 打印


比较表达式

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
	>		: 小于
< : 大于
>= : 小于等于
<= : 大于等于
~ : 正则匹配(包含)
!~ : 正则匹配(不包含)


案例1:

要求打印属组ID大于属主ID的行

awk -F: '$4 > $3{print $0}' /etc/passwd

解析:

$4 : 代表属组所在列

$3 : 代表属主所在列

$0 : 所有行



案例2:

打印结尾包含bash

awk -F: '$NF ~ /bash/{print $0}' /etc/passwd

解析:

$NF ~ /bash/ :尾部最后一列 包含 bash 的行

~ : 包含


a案例3:

打印结尾不包含bash

awk -F '$NF !~ /bash/{print $0}' /etc/passwd

解析:

!~ : 不包含 (将打印其他内容)


条件表达式

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
==		
>
<
>=
<=


要求打印第三行

案例1:

awk -F: 'NR == 3{print $0} /etc/passwd'

解析:

NR : 行号

NR == 3 : 行号等于3


注意:

$1 : 是列

NR == 3 : 是行




逻辑表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	&&		: 逻辑与
|| : 逻辑或
! : 逻辑非


案例1:(与(两者条件必须都成立))

awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd




案例2:(或(两者条件一个成立即可))

awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd


案例3:(非(条件取反))

awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd


grep 查找功能 过滤文本