Linux三剑客awk
Linux三剑客awk
awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel的样式
awk早期在Unix上实现,我们用的awk是gawk,是GUN awk的意思
[root@xuexi3 tmp]# which awk
/usr/bin/awk
[root@xuexi3 tmp]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Aug 16 14:33 /usr/bin/awk -> gawk
awk更是一门编程语言,支持条件判断、数组、循环等功能
再谈三剑客
- grep,更擅长单纯的查找或匹配文本内容
- sed,更擅长编辑,处理匹配到的文本内容
- awk,更适合格式化文本内容,对文本进行复杂处理
三个命令称之为三剑客
awk基础
awk [option] 'pattren[action]' file ...
awk 参数 '条件动作' 文件
- Action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print是printf
awk场景
动作场景
[root@xuexi3 home]# awk '{print $1}' cssed.txt #输出第一列
s1
s7
s12
s18
s28
s33
s40
s48
[root@xuexi3 home]# awk '{print $0}' cssed.txt #输出全部
s1 s2 s3 s4 s5 s6
s7 s8 s9 s10 s11
s12 s13 s14 s15 s16 s17
s18 s19 s20 s21 s22 s23 s25 s26 s27
s28 s29 s30 s31 s32
s33 s34 s35 s36 s37 s38 s39
s40 s41 s42 s43 s44 s45 s46 s47
s48 s49 s50
[root@xuexi3 home]# awk '{print $2}' cssed.txt #输出第二列
s2
s8
s13
s19
s29
s34
s41
s49
我们执行的命令是awk ‘{print $2}’,没有使用参数和模式,$2表示输出文本的第二列信息
awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符
awk是按行处理文件, 一行处理完,处理下一行,根据用户指定的分割符去工作,没有指定默认空格
指定分割符后,awk把每一行切割后的数据对应到内置变量
- $0表示整行
- $NF表示当前分割后的最后一行
- 倒数第二列可以写成$(ND-1)
awk内置变量
内置变量 | 解释 |
---|---|
$n | 指定分隔符后,当前记录的第n个字段 |
$0 | 完整的输入记录 |
FS | 字段分隔符,默认是空格 |
NF(Number of fields) | 分割后,当前行一共有多少个字段 |
NR(Number of records) | 当前记录数,行数 |
更多内置变量可以man手册查看 | man awk |
一次打印多行
[root@xuexi3 home]# cat cssed.txt
s1 s2 s3 s4 s5 s6
s7 s8 s9 s10 s11
s12 s13 s14 s15 s16 s17
s18 s19 s20 s21 s22 s23 s25 s26 s27
s28 s29 s30 s31 s32
s33 s34 s35 s36 s37 s38 s39
s40 s41 s42 s43 s44 s45 s46 s47
s48 s49 s50
[root@xuexi3 home]# awk '{print $1,$2,$5}' cssed.txt
s1 s2 s5
s7 s8 s11
s12 s13 s16
s18 s19 s22
s28 s29 s32
s33 s34 s37
s40 s41 s44
s48 s49
[root@xuexi3 home]# awk '{print $1,$5,$3}' cssed.txt
s1 s5 s3
s7 s11 s9
s12 s16 s14
s18 s22 s20
s28 s32 s30
s33 s37 s35
s40 s44 s42
s48 s50
自定义输出内容
awk,必须外层单引号,内层双引号
内置变量$1、$2,都不得添加双引号,否则会识别为文本,尽量别加引号
[root@xuexi3 home]# awk '{print "第一列:"$1,"第二列:"$3}' cssed.txt
第一列:s1 第二列:s3
第一列:s7 第二列:s9
第一列:s12 第二列:s14
第一列:s18 第二列:s20
第一列:s28 第二列:s30
第一列:s33 第二列:s35
第一列:s40 第二列:s42
第一列:s48 第二列:s50
awk参数
参数 | 解释 |
---|---|
-F | 指定 |
-v | 定义或修改一个awk内部的变量 |
-f | 从脚本文件中读取awk命令 |
awk '模式{动作}' 文件
awk案例
显示文件第五行
#=NR在awk中表示行号,NR==5表示行号是5的那一行
#注意一个等于号是修改变量的意思,两个等于号是关系运算符,是“等于的意思”
[root@xuexi3 home]# awk 'NR==5' cssed.txt
s28 s29 s30 s31 s32
显示文件2-5行
设置模式条件
#告诉awk,我要看行号2到5的内容
[root@xuexi3 home]# awk 'NR==2,NR==5' cssed.txt
s7 s8 s9 s10 s11
s12 s13 s14 s15 s16 s17
s18 s19 s20 s21 s22 s23 s25 s26 s27
s28 s29 s30 s31 s32
给每一行的内容添加行号
添加变量,NR等于行号,$0表示一整行的内容
{print}是awk的动作
[root@xuexi3 home]# awk 'NR==2,NR==5 {print NR,$0}' cssed.txt
2 s7 s8 s9 s10 s11
3 s12 s13 s14 s15 s16 s17
4 s18 s19 s20 s21 s22 s23 s25 s26 s27
5 s28 s29 s30 s31 s32
显示文件的第一列,倒数第二列和倒数第三列
[root@xuexi3 home]# awk '{print $1 ,$(NF-1),$(NF-3)}' cssed.txt
s1 s5 s3
s7 s10 s8
s12 s16 s14
s18 s26 s23
s28 s31 s29
s33 s38 s36
s40 s46 s44
s48 s49 s48 s49 s5
利用awk取出ifconfig里IP地址
[root@xuexi3 home]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.102 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::c8ef:f7f6:2949:b8fb prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:72:4f:0f txqueuelen 1000 (Ethernet)
RX packets 5865 bytes 544833 (532.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3437 bytes 350034 (341.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@xuexi3 home]# ifconfig ens33 | awk 'NR==2 {print $2}'
10.0.0.102
awk分隔符
wak分隔符分为两种
- 输入分隔符,awk默认是空格,空白字符,英文field separator变量名是FS
- 输出分隔符,output field separator,简称OFS
FS输入分隔符
awk逐行处理文本的时候,以输入分隔符为准,把文本切成多个片段,默认符号是空格
当我们处理特殊文件,没有空格的时候,可以自由指定分隔符特点
[root@xuexi3 etc]# awk -F ":" '{print $1,$NF}' passwd ## -F ":"从新定义:为分隔符取第一列和最后一列输出
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
- 除了使用-F选项,还可以使用变量的形式,指定分隔符,使用-v选项搭配,修改FS变量
awk -v FS=":" '{print $1.$NF}' file(文件名)
OFS输出分隔符
awk执行完命令,默认用空格隔开每一列,这个空格就是awk的默认输出符,例如
[root@xuexi3 etc]# awk -F":" -v OFS="---" '{print $1,$NF}' passwd
root---/bin/bash
bin---/sbin/nologin
daemon---/sbin/nologin
adm---/sbin/nologin
lp---/sbin/nologin
sync---/bin/sync
shutdown---/sbin/shutdown
halt---/sbin/halt
mail---/sbin/nologin
operator---/sbin/nologin
games---/sbin/nologin
ftp---/sbin/nologin
nobody---/sbin/nologin