AWK-常见场景汇总

内置变量

当前记录以及某个字段

  • $0, 整个文本行
  • $1, 文本行中的第一个数据字段
  • $2, 文本行中的第二个数据字段
  • $n, 文本行中的第 n 个数据字段

如:

1
2
ifconfig | awk '/inet/{print $0}'
ifconfig | awk '/inet/{print $3}'

记录的字段数

1
ifconfig | awk '/inet6/{print NF}'
  • NF 指 number of fields

最后一个字段

1
ifconfig | awk '/inet/{print $NF}'

指定行进行匹配

1
ifconfig | awk 'NR==2{print $NF}'
  • NR 指 Number of the current Record

字段分隔符

输入字段分隔符

指定用什么来将一个记录拆分为多个字段.

可以用命令行参数指定:

1
2
ifconfig | awk '/inet6/{print $2}' > ifconfig3.txt
awk -F: '{print $1,$2,$3,$4,$5,$6,$7,$8}' ifconfig3.txt

也可以用内置变量指定:

1
awk 'BEGIN{FS=":"};{print $1,$2,$3,$4,$5,$6,$7,$8}' ifconfig3.txt
  • FS, 指 input Field Separator

输出字段分隔符

即输出字段时用什么连接字段.

用内置变量指定:

1
awk -F: 'BEGIN{OFS="|"};{print $1,$2,$3,$4,$5,$6,$7,$8}' ifconfig3.txt
  • OFS 指 Output Field Separator

记录分隔符

输入记录分隔符

1
2
ifconfig | awk 'NR==2{print $2}' > ifconfig3.txt
awk 'BEGIN{RS="."}{print $0}' ifconfig3.txt
  • RS 指 Record Separator

输出记录分隔符

1
awk 'BEGIN{RS=".";ORS=" "};{print $0}' ifconfig3.txt
  • ORS 指 Output Record Separator

格式化输出

1
2
ifconfig | awk 'NR==2;NR==11{print $0}' > ifconfig3.txt
awk '{printf "%-5s%-20s%-10s%-20s%-10s%-20s\n",$1,$2,$3,$4,$5,$6}' ifconfig3.txt

匹配

行号

1
ifconfig | awk 'NR=2{print $2}'

正则

1
ifconfig | awk '/inet/{print $2}'

控制语句

条件控制

1
ifconfig | awk '{if($1=="inet"){print $2}}'

循环控制

C 系的 for 以及 while 循环:

1
ifconfig | awk 'BEGIN{for(i=1;i<20;i++){printf "*"};printf "\n"};NR==2{print $2};END{i=1;while(i<20){printf "#";i++};printf "\n"}'

脚本

1
2
3
4
5
6
7
8
9
10
11
[root@openEuler ~]# vim ifconfig3.sh
[root@openEuler ~]# cat ifconfig3.sh
#!/bin/awk -f
BEGIN{for(i=1;i<20;i++){printf "*"};printf "\n"};NR==2{print $2};END{i=1;while(i<20){printf "#";i++};printf
"\n"}
[root@openEuler ~]#
[root@openEuler ~]# ifconfig | awk -f ifconfig3.sh
*******************
192.168.0.22
###################
[root@openEuler ~]#

AWK-常见场景汇总
http://example.com/2024/08/09/AWK-常见场景汇总/
作者
Jie
发布于
2024年8月9日
许可协议