1.awk
awk是一种强大的编辑工具,相较于sed常常作用于一整个行的处理,
awk则比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。
默认情况下字段的分隔符为空格或 tab 键。
awk执行结果可以通过print的功能将字段数据打印显示。
awk会逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;
还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。
语法
awk ‘条件1{动作1} 条件2{动作2}…’ 文件名
常用变量:
NF 当前处理的行的字段个数
NR 当前处理的行的行号
FS 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与-F作用相同
$0 当前处理的行的整行内容
$n 当前处理行的第n个字段(第n列)
RS 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记
录,以进行处理。预设值是’\n’
FILENAME 被处理的文件名
一般使用关系表达式作为条件
BEGIN:在awk程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次。
END:在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于。用于判断两个值是否相等,如果是给变量赋值,使用“”。
!= 不等于
A~B 判断字符串A中是否包含能匹配B表达式的子字符串。
A!~B 判断字符串A中是否不包含能匹配B表达式的子字符串。
创建文件text.txt
id name sex age
1 zhanshan M 20
2 lisi F 21
3 wangwu M 22
4 zhaoliu M 23
示例
1.1 打印文件所有内容
[root@VM-12-14-centos ~]# cat text24.txt
id name sex age
1 zhanshan M 20
2 lisi F 21
3 wangwu M 22
4 zhaoliu M 23
[root@VM-12-14-centos ~]# awk '{print}' text24.txt
id name sex age
1 zhanshan M 20
2 lisi F 21
3 wangwu M 22
4 zhaoliu M 23
$0 代表所有内容
[root@VM-12-14-centos ~]# awk '{print $0}' text24.txt
id name sex age
1 zhanshan M 20
2 lisi F 21
3 wangwu M 22
4 zhaoliu M 23
1.2 输出含有指定数据行
[root@VM-12-14-centos ~]# awk '/id/{print $0}' text24.txt
id name sex age
1.3 输出指定行(NR)
第一行和第二行
[root@VM-12-14-centos ~]# awk 'NR==1,NR==2 {print}' text24.txt
id name sex age
1 zhanshan M 20
第三行和第四行
[root@VM-12-14-centos ~]# awk 'NR==3,NR==4 {print}' text24.txt
2 lisi F 21
3 wangwu M 22
第一行到第三行
[root@VM-12-14-centos ~]# awk '(NR>=1)&&(NR<=3) {print}' text24.txt
id name sex age
1 zhanshan M 20
2 lisi F 21
第二行以及之后所有行
[root@VM-12-14-centos ~]# awk 'NR>=2 {print}' text24.txt
1 zhanshan M 20
2 lisi F 21
3 wangwu M 22
4 zhaoliu M 23
输出奇数行(除二取余,余为1为奇数,为0为偶数)
[root@VM-12-14-centos ~]# awk '(NR%2)==1 {print}' text24.txt
id name sex age
2 lisi F 21
4 zhaoliu M 23
[root@VM-12-14-centos ~]#
输出偶数行
[root@VM-12-14-centos ~]# awk '(NR%2)==0 {print}' text24.txt
1 zhanshan M 20
3 wangwu M 22
输出i开头的行
[root@VM-12-14-centos ~]# awk '/^i/ {print}' text24.txt
id name sex age
输出1开头的行
[root@VM-12-14-centos ~]# awk '/^1/ {print}' text24.txt
1 zhanshan M 20
输出e结尾的行
[root@VM-12-14-centos ~]# awk '/e$/ {print}' text24.txt
id name sex age
1.4 输出列
示例
[root@VM-12-14-centos ~]# awk -F " " '{print $4}' text24.txt
age
20
21
22
23
其中,-F" "是指定," "是分隔符,$4是第四个字段
输出第四列和第二列内容
[root@VM-12-14-centos ~]# awk -F " " '{print $4,$2}' text24.txt
age name
20 zhanshan
21 lisi
22 wangwu
23 zhaoliu
输出第四行小于21的第四行和第一行
[root@VM-12-14-centos ~]# awk -F " " '$4<21{print $4,$2}' text24.txt
20 zhanshan
输出第四行大于21的第四行和第二行的列
[root@VM-12-14-centos ~]# awk -F " " '!($4<21){print $4,$2}' text24.txt
age name
21 lisi
22 wangwu
23 zhaoliu
[root@VM-12-14-centos ~]#
注意($4<21)需要括号括起来
1.5 BEGIN、END模式
语法
awk 'BEGIN{...}; {...}; END{...}' 文件
BEGIN模式是在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;
awk再处理指定的文本,之后再执行END模式中指定的动作;
END{ } 语句块中,往往会放入打印结果等语句。
示例
[root@VM-12-14-centos ~]# awk 'BEGIN {x=0};/1$/;{x++};END{print x}' text24.txt
2 lisi F 21
5
[root@VM-12-14-centos ~]# awk 'BEGIN {x=0};/2$/;{x++};END{print x}' text24.txt
3 wangwu M 22
5
x是寻找次数,/1$/是以1结尾的行。
查看内存使用情况
[root@VM-12-14-centos ~]# free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'
74%
[root@VM-12-14-centos ~]# free -m
total used free shared buff/cache available
Mem: 1998 293 92 0 1612 1514
Swap: 1024 1 1023
2.sed
sed是一种主流编辑器,它一次处理一行内容,将这行放入缓存(存区空间称为: 模式空间),然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。
模式匹配
sed会读取每一行数据到模式空间中,之后判断当前行是否符合模式匹配要求,符合要求就会执行sed程序命令,否则不会执行sed程序命令;如果不写匹配模式,那么每一行都会执行sex程序命令
参数
-e: 直接在指令列模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项;一行命令语句可以执行多条sed命令。
-i : 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改。
-f: 后跟保存了sed指令的文件
-n: 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行.
-r: 使用扩展正则表达式,默认情况sed只识别基本正则表达式*
示例
2.1 添加数据
创建sed.txt文件
[root@VM-12-14-centos ~]# touch sed.txt
[root@VM-12-14-centos ~]# chmod 777 sed.txt
[root@VM-12-14-centos ~]# vim sed.txt
123
456
4as
sed
Mod
ASD
3a表示在第三行前面添加数据
[root@VM-12-14-centos ~]# sed '3a ddd' sed.txt
123
456
4as
ddd
sed
Mod
ASD
3i表示在第三行后面添加数据
[root@VM-12-14-centos ~]# sed '3i ddd' sed.txt
123
456
ddd
4as
sed
Mod
ASD
/5/a表示在含有5的一行后面添加内容,有几个5添加几个
[root@VM-12-14-centos ~]# sed '/5/a ddd' sed.txt
123
456
ddd
4as
sed
Mod
ASD
[root@VM-12-14-centos ~]# sed '/d/a ddd' sed.txt
123
456
4as
sed
ddd
Mod
ddd
ASD
/1/i表示在含有1的一行前面添加内容,有几个1添加几个
[root@VM-12-14-centos ~]# sed '/1/i ddd' sed.txt
ddd
123
456
4as
sed
Mod
ASD
$a表示在最后一行前面添加内容
[root@VM-12-14-centos ~]# sed '$a ddd' sed.txt
123
456
4as
sed
Mod
ASD
ddd
$i表示在第一行前面添加内容
[root@VM-12-14-centos ~]# sed '$i ddd' sed.txt
123
456
4as
sed
Mod
ddd
ASD
2.2 删除数据
删除第一行
[root@VM-12-14-centos ~]# sed '1d' sed.txt
456
4as
sed
Mod
ASD
删除1,2行
[root@VM-12-14-centos ~]# sed '1,2d' sed.txt
4as
sed
Mod
ASD
除了第一行全部删除
[root@VM-12-14-centos ~]# sed '1!d' sed.txt
123
删除含有指定内容的行数
[root@VM-12-14-centos ~]# sed '/123/d' sed.txt
456
4as
sed
Mod
ASD
[root@VM-12-14-centos ~]# sed '/d/d' sed.txt
123
456
4as
ASD
2.3 修改数据
修改指定行
修改第一行为111
[root@VM-12-14-centos ~]# sed '1c 111' sed.txt
111
456
4as
sed
Mod
ASD
修改第一行和第二行为111(只有一行111)
[root@VM-12-14-centos ~]# sed '1,2c 111' sed.txt
111
4as
sed
Mod
ASD
修改包含某个数据的行
[root@VM-12-14-centos ~]# sed '/1/c 111' sed.txt
111
456
4as
sed
Mod
ASD
2.4参数i
加上-i将修改后的结果放到文件
[root@VM-12-14-centos ~]# cat sed.txt
123
456
4as
sed
Mod
ASD
[root@VM-12-14-centos ~]# sed -i '/1/c 111' sed.txt
[root@VM-12-14-centos ~]# cat sed.txt
111
456
4as
sed
Mod
ASD