Linux三剑客之awk
概述
awk有强大的文本格式化的能力,对文本进行复杂处理;并且支持条件判断,数组以及循环等功能。
awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符。
awk是按行处理,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有分割符默认为空格。
语法:
awk options pattern {action} file 可选参数 '条件动作' 文件/数据 awk的内置命令: $0:表示整行(完整的输入记录——即某个文件的所有内容 $1(n):表示第一列(指定分隔符后,当前记录的第n个字段) NF:分割后,当前行一共有多少个字段 NR:当前记录数,行数 # 例如:NR==5 表示第5行 # 可以使用man awk来查看
语法1:
awk参数: -F 指定分割字符串 -v 定义或者修改一个awk的内部变量 -f 从脚本文件中读取awk命令 # 示例: root@k8s-node1 ~]# awk -F':' '{print $1}' test.sh # 以:为输入分隔符获取该文件第一列的内容 ROOT ETCD bin daemon adm lp [root@k8s-node1 ~]# awk -v FS=":" '{print $1,$NF}' /etc/passwd # -v 指定变量FS=":"为输入分隔符 root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin sync /bin/sync shutdown /sbin/shutdown halt /sbin/halt [root@k8s-node1 ~]# awk -F=":" -v OFS="####" '{print $1,$NF}' /etc/passwd [root@k8s-node1 ~]# awk -v FS=":" -v OFS="####" '{print $1,$NF}' /etc/passwd # -v 也可以指定OFS=”###“为输出分隔符 root####/bin/bash bin####/sbin/nologin daemon####/sbin/nologin adm####/sbin/nologin lp####/sbin/nologin
awk的分隔符
输入分隔符:awk默认是空格,空白字符;变量名是FS;当我们处理特殊文件时,可以自由指定分隔符。
输出分隔符:awk默认是空格,变量名简称是OFS。
awk的内置变量
FILENAME 当前输入文件的名。 FS 字段分隔符(默认是任何空格)。 OFS 输出字段分隔符(默认值是一个空格)。 NF 表示字段数,在执行过程中对应于当前的字段数。 NR 表示记录数,在执行过程中对应于当前的行号。 FNR 各文件分别计数的行号 ORS 输出记录分隔符(默认值是一个换行符)。 RS 记录分隔符(默认是一个换行符)。 ARGC 命令行参数的数目。 ARGV 数组,保存的是命令行的各参数。
实例:
1、一次性输出多列
[root@k8s-node1 ~]# cat -n test1.sh 1 pyyu0 pyyu1 pyyu2 pyyu3 pyyu4 2 pyyu5 pyyu6 pyyu7 pyyu8 pyyu9 3 pyyu10 pyyu11 pyyu12 pyyu13 pyyu14 4 pyyu15 pyyu16 pyyu17 pyyu18 pyyu19 5 pyyu20 pyyu21 pyyu22 pyyu23 pyyu24 6 pyyu25 pyyu26 pyyu27 pyyu28 pyyu29 7 pyyu30 pyyu31 pyyu32 pyyu33 pyyu34 8 pyyu35 pyyu36 pyyu37 pyyu38 pyyu39 9 pyyu40 pyyu41 pyyu42 pyyu43 pyyu44 10 pyyu45 pyyu46 pyyu47 pyyu48 pyyu49 [root@k8s-node1 ~]# awk '{print $0}' test1.sh # 查看全部 [root@k8s-node1 ~]# awk '{print}' test1.sh pyyu0 pyyu1 pyyu2 pyyu3 pyyu4 pyyu5 pyyu6 pyyu7 pyyu8 pyyu9 pyyu10 pyyu11 pyyu12 pyyu13 pyyu14 pyyu15 pyyu16 pyyu17 pyyu18 pyyu19 pyyu20 pyyu21 pyyu22 pyyu23 pyyu24 pyyu25 pyyu26 pyyu27 pyyu28 pyyu29 pyyu30 pyyu31 pyyu32 pyyu33 pyyu34 pyyu35 pyyu36 pyyu37 pyyu38 pyyu39 pyyu40 pyyu41 pyyu42 pyyu43 pyyu44 pyyu45 pyyu46 pyyu47 pyyu48 pyyu49 [root@k8s-node1 ~]# awk '{print $1,$2}' test1.sh # 输出第一列,第二列(中间用,隔开) pyyu0 pyyu1 pyyu5 pyyu6 pyyu10 pyyu11 pyyu15 pyyu16 pyyu20 pyyu21 pyyu25 pyyu26 pyyu30 pyyu31 pyyu35 pyyu36 pyyu40 pyyu41 pyyu45 pyyu46
2、自定义输出内容。
[root@k8s-node1 ~]# awk '{print "第一列:"$1,"第二列:"$2}' test1.sh 第一列:pyyu0 第二列:pyyu1 第一列:pyyu5 第二列:pyyu6 第一列:pyyu10 第二列:pyyu11 第一列:pyyu15 第二列:pyyu16 第一列:pyyu20 第二列:pyyu21 第一列:pyyu25 第二列:pyyu26 第一列:pyyu30 第二列:pyyu31 第一列:pyyu35 第二列:pyyu36 第一列:pyyu40 第二列:pyyu41 第一列:pyyu45 第二列:pyyu46 # awk 外层使用单引号,内层使用双引号;内置变量$1,$2都不加引号,以防识别为文本内容
3、显示文件3-8行的内容
[root@k8s-node1 ~]# awk 'NR==3,NR==5' test1.sh pyyu10 pyyu11 pyyu12 pyyu13 pyyu14 pyyu15 pyyu16 pyyu17 pyyu18 pyyu19 pyyu20 pyyu21 pyyu22 pyyu23 pyyu24 # 显示第3行到第5行的内容
4、设置模式(条件)
截取文件内容中第三行的第一个字段
[root@k8s-node1 ~]# awk 'NR==3{print $1}' test1.sh pyyu10 # 截取第5行的内容 [root@k8s-node1 ~]# awk 'NR==3{print}' test1.sh pyyu10 pyyu11 pyyu12 pyyu13 pyyu14 [root@k8s-node1 ~]# awk 'NR==3{print $0}' test1.sh pyyu10 pyyu11 pyyu12 pyyu13 pyyu14 练习: [root@k8s-node1 ~]# free total used free shared buff/cache available Mem: 15731672 2854776 9175884 6160 3701012 12552812 Swap: 0 0 0 [root@k8s-node1 ~]# free | awk 'NR==2{print $3}' 2855024 [root@k8s-node1 ~]# free | awk '{print $3}' free 2853520 0
5、给文件添加行号
[root@k8s-node1 ~]# awk '{print NR,$0}' test1.sh 1 pyyu0 pyyu1 pyyu2 pyyu3 pyyu4 2 pyyu5 pyyu6 pyyu7 pyyu8 pyyu9 3 pyyu10 pyyu11 pyyu12 pyyu13 pyyu14 4 pyyu15 pyyu16 pyyu17 pyyu18 pyyu19 5 pyyu20 pyyu21 pyyu22 pyyu23 pyyu24 6 pyyu25 pyyu26 pyyu27 pyyu28 pyyu29 7 pyyu30 pyyu31 pyyu32 pyyu33 pyyu34 8 pyyu35 pyyu36 pyyu37 pyyu38 pyyu39 9 pyyu40 pyyu41 pyyu42 pyyu43 pyyu44 10 pyyu45 pyyu46 pyyu47 pyyu48 pyyu49 # 显示文件的3-5行 [root@k8s-node1 ~]# awk 'NR==3,NR==5{print NR,$0}' test1.sh 3 pyyu10 pyyu11 pyyu12 pyyu13 pyyu14 4 pyyu15 pyyu16 pyyu17 pyyu18 pyyu19 5 pyyu20 pyyu21 pyyu22 pyyu23 pyyu24 # 显示文件的第1列,倒数第2列和最后1列 [root@k8s-node1 ~]# awk '{print $1,$(NF-1),$NF}' test1.sh pyyu0 pyyu3 pyyu4 pyyu5 pyyu8 pyyu9 pyyu10 pyyu13 pyyu14 pyyu15 pyyu18 pyyu19 pyyu20 pyyu23 pyyu24 pyyu25 pyyu28 pyyu29 pyyu30 pyyu33 pyyu34 pyyu35 pyyu38 pyyu39 pyyu40 pyyu43 pyyu44 pyyu45 pyyu48 pyyu49
6、利用awk去除IP地址信息
[root@k8s-node1 ~]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.41 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::216:3eff:fe38:7026 prefixlen 64 scopeid 0x20<link> ether 00:16:3e:38:70:26 txqueuelen 1000 (Ethernet) RX packets 15734888 bytes 6580772034 (6.1 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 13116110 bytes 1139846254 (1.0 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@k8s-node1 ~]# ifconfig eth0 | awk 'NR==2' inet 10.0.0.41 netmask 255.255.255.0 broadcast 10.0.0.255 [root@k8s-node1 ~]# ifconfig eth0 | awk 'NR==2' | awk '{print $2}' 10.0.0.41