awk

半城伤御伤魂 提交于 2021-02-17 09:53:35

 awk工具

  • 截取文档中的某个段
[root@localhost ~]# mkdir awk
[root@localhost ~]# cp /etc/passwd awk/test.txt
[root@localhost ~]# cd awk
[root@localhost awk]# ls
test.txt
[root@localhost awk]# awk -F ':' '{print $1}' test.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-bus-proxy
systemd-network
dbus
polkitd
tss
postfix
sshd
user1
user2
test

-F 指定分隔符 。 print为打印的动作,用来打印某个字段。$1为第1个字段。 $0比较特殊,表示整行。

[root@localhost awk]# head -n2 test.txt |awk -F ':' '{print $0}' 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

 

  • 匹配字符或者字符串(实现grep的功能,但没有颜色显示,肯定没有grep用起来方便)
[root@localhost awk]# awk '/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost awk]# awk -F ":"  '$1 ~/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F ":" '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
root 0
operator 11
test 1005

匹配完root, 再匹配test,它还可以只打印所匹配的段。

 

  • 条件操作符
[root@localhost awk]# awk -F ":"  '$3=="0"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#加双引号“” 会认为是字符

# 不加双引号是数字
[root@localhost awk]# awk -F ":"  '$3>=500' /etc/passwd
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
user1:x:1004:1001::/home/u/u1:/bin/bash
user2:x:1001:1001::/home/user2:/bin/bash
test:x:1005:1005::/home/test:/bin/bash

 

  • awk内置变量

NF表示用分隔符分隔后一共有多少段,NR表示行号。

OFS的用法:

[root@localhost awk]# head -5 /etc/passwd | awk -F ':' '{OFS="#"}{print $1,$3,$4}'
root#0#0
bin#1#1
daemon#2#2
adm#3#4
lp#4#7

 

NF用法:$NF 是最后一段的值。

[root@localhost awk]# head -n3 /etc/passwd | awk -F ':' '{print NR}'
1
2
3

NR 作为判断条件。也可以配合段匹配一起使用。

[root@localhost awk]# awk -F ":"  'NR<20 && $1 ~/roo/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

 

  • awk数学运算—更改段值。
[root@localhost awk]# head -n 3 /etc/passwd |awk -F ':' '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin

 

[root@localhost awk]# awk -F ":" '{(tot=tot+$3)}; END {print tot}' /etc/passwd
5674

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!