awk 基础语法(2):awk变量

北城以北 提交于 2019-12-27 03:53:05

1. awk 变量

1.1. awk 内部变量

$0 当前处理行的所有记录
$1,$2,$3...$n 文件中每行以间隔符号分割的不同字段
NF当前记录的字段数(列数)
$NF最后一列
FNR/NR行号
FS定义间隔符
OFS定义输出字符分隔符,默认空格
RS输入记录分隔符,默认换行
ORS输出记录分隔符,默认换行

1.2. awk 内部变量举例

1.2.1. 案例数据
# chen @ localhost in ~/Shell [17:25:59] 
$ cat -n passwd
     1	root:x:0:0:root:/root:/bin/zshi	
     2	cccccccccccccccccccbbbbbbbbbbbbbbb:aa
     3	in:x:1:1:bin:/bin:/sbin/nologin
     4	ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
     5	adm:x:3:4:adm:/var/adm:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync	
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
1.2.2. 输出 passwd 文件中所有行
# chen @ localhost in ~/Shell [17:51:07] 
$ awk '{print $0}' passwd
root:x:0:0:root:/root:/bin/zshi	
cccccccccccccccccccbbbbbbbbbbbbbbb:aa
in:x:1:1:bin:/bin:/sbin/nologin
ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync	
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
1.2.3. 输出 passwd 文件中1至5行
# chen @ localhost in ~/Shell [17:52:34] 
$ awk 'NR==1,NR==5 {print $0}' passwd
root:x:0:0:root:/root:/bin/zshi	
cccccccccccccccccccbbbbbbbbbbbbbbb:aa
in:x:1:1:bin:/bin:/sbin/nologin
ddaemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
1.2.4. 输出 passwd 文件中1,5行
# chen @ localhost in ~/Shell [17:55:10] 
$ awk 'NR==1 || NR==5 {print $0}' passwd
root:x:0:0:root:/root:/bin/zshi	
adm:x:3:4:adm:/var/adm:/sbin/nologin
1.2.5. 输出 passwd 文件中每行第一列,倒数第一列,倒数第二列
# chen @ localhost in ~/Shell [17:59:57] 
$ awk -F: '{print $1, $NF, $(NF-1)}' passwd
root /bin/zshi	 /root
cccccccccccccccccccbbbbbbbbbbbbbbb aa cccccccccccccccccccbbbbbbbbbbbbbbb
in /sbin/nologin /bin
ddaemon /sbin/nologin /sbin
adm /sbin/nologin /var/adm
sync /bin/sync	 /sbin
shutdown /sbin/shutdown /sbin

1.2.6. 输出 passwd 文件中每行的列数
# chen @ localhost in ~/Shell [18:00:52] 
$ awk -F: '{print NF}' passwd
7
2
7
7
7
7
7
1.2.7. 输出 passwd 文件中包含adm 的第一列
# chen @ localhost in ~/Shell [18:03:05] 
$ awk -F: '/adm/{print $1}' passwd
adm
1.2.8. 以@@@为分隔符,输出 passwd 文件中的第一列和最后一列
# chen @ localhost in ~/Shell [18:07:29] 
$ awk -F: 'BEGIN {OFS="@@@"} {print $1,$NF}' passwd
root@@@/bin/zshi	
cccccccccccccccccccbbbbbbbbbbbbbbb@@@aa
in@@@/sbin/nologin
ddaemon@@@/sbin/nologin
adm@@@/sbin/nologin
sync@@@/bin/sync	
shutdown@@@/sbin/shutdown
# 方法2
# chen @ localhost in ~/Shell [18:08:26] C:1
$ awk 'BEGIN {FS=":";OFS="@@@"} {print $1,$NF}' passwd
# 方法3
# chen @ localhost in ~/Shell [18:08:51] 
$ awk 'BEGIN {FS=":"} {print $1"@@@"$NF}' passwd

1.3. awk 工作原理

  • awk 使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符 (RS) 结束。
  • awk 使用 print 函数打印字段,打印出来的字段会以空格分隔,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为输出字段分隔符OFS(内部变量),OFS默认为空格。
  • awk 处理完一行后,将从文件中获取另一行,并将其保存在 $0 中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!