作用:数据处理工具,用于把一行中分成数个字段处理(切割)
awk ‘条件类型 1 {操作1} 条件类型2 {操作2} ...‘ filename
awk主要处理一行内的数据,默认的分隔符为“空格键”或“TAB键”
[root@localhost ~]# last -n 5
root pts/1 192.168.43.99 Thu Mar 12 10:25 still logged in
root tty1 Thu Mar 12 10:24 still logged in
root pts/0 192.168.43.99 Thu Mar 12 09:55 - 10:26 (00:31)
reboot system boot 3.10.0-1062.12.1 Thu Mar 12 09:55 - 11:12 (01:17)
root pts/0 192.168.43.99 Wed Mar 11 17:06 - down (00:09)
wtmp begins Sat Nov 16 04:06:53 2019
[root@localhost ~]# last -n 5 | awk ‘{print $1 "\t" $3}‘
root 192.168.43.99
root Thu
root 192.168.43.99
reboot boot
root 192.168.43.99
wtmp Sat
上面例子中$1是root,是该行第一栏的内容,$3是192.168.43.99 ,是该行第三栏的内容。$0代表一整行数据。
变量名称 | 含义 |
---|---|
NF | 每行($0)拥有的字段数 |
NR | 目前awk所处理第几行 |
FS | 目前分割字符,默认为空格键 |
FILENAME | awk浏览的文件名 |
... | ... |
[root@localhost ~]# last -n 5 | awk ‘{print $1 "\t lines: " NR "\t columns:" NF}‘
root lines: 1 columns:10
root lines: 2 columns:9
root lines: 3 columns:10
reboot lines: 4 columns:11
root lines: 5 columns:10
lines: 6 columns:0
wtmp lines: 7 columns:7
运算单元 | 含义 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
[root@localhost ~]# cat /etc/passwd | awk ‘{FS=":"} $3<10 {print $1 "\t" $3}‘
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
这有一个为问题:第一行没有正确分割,因为读第一行时默认还是以空格键分割 (--感觉是个缺陷呀)
解决方法:预先设置awk变量,利用BEGIN关键词
[root@localhost ~]# cat /etc/passwd | awk ‘BEGIN {FS=":"} $3<10 {print $1 "\t" $3}‘
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@localhost ~]# awk ‘/root/‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# awk -F: ‘/root/ {print $7}‘ /etc/passwd //-F: 等效于FS=":"
/bin/bash
/sbin/nologin
[root@localhost ~]# awk -F ‘:‘ ‘{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}‘ /etc/passwd | head -n 5
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
filename:/etc/passwd,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
filename:/etc/passwd,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# awk -F: ‘{printf ("filename:%10s, linenumber:%3s,column:%3s,content:%4s\n",FILENAME,NR,NF,$0)}‘ /etc/passwd | head -n 5
filename:/etc/passwd, linenumber: 1,column: 7,content:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd, linenumber: 2,column: 7,content:bin:x:1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd, linenumber: 3,column: 7,content:daemon:x:2:2:daemon:/sbin:/sbin/nologin
filename:/etc/passwd, linenumber: 4,column: 7,content:adm:x:3:4:adm:/var/adm:/sbin/nologin
filename:/etc/passwd, linenumber: 5,column: 7,content:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# awk -F: ‘NR==2{print "filename: "FILENAME, $0}‘ /etc/passwd
filename: /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# awk -F ":" ‘{print $1}‘ /etc/passwd | head -n 8
root
bin
daemon
adm
lp
sync
shutdown
halt
[root@localhost ~]# awk -F ":" ‘{print $NF}‘ /etc/passwd | tail -n 5
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/sbin/nologin
[root@localhost ~]# awk -F ":" ‘{print $(NF-1)}‘ /etc/passwd | head -n 5
/root
/bin
/sbin
/var/adm
/var/spool/lpd
[root@localhost ~]# awk -F ":" ‘{if(NR<31 && NR >12) print $1}‘ /etc/passwd
nobody
systemd-network
dbus
polkitd
libstoragemgmt
colord
rpc
saslauth
abrt
setroubleshoot
rtkit
radvd
gluster
chrony
qemu
unbound
tss
usbmuxd
[root@localhost ~]# awk -F "[/]" ‘NR == 4 {print $0,"\n",$1}‘ /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:
原文:https://www.cnblogs.com/wind-zhou/p/12829192.html