Linux学习之shell6

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值