awk是一个数据处理工具。与sed处理整行数据相比。awk则比较倾向将一行分成数个“字段”来处理。
awk通常运行的格式是这样的:
awk '条件类型1 {动作1} 条件类型2 {动作2} ...' filename
变量名的含义
NR:当前的行号
NF:当前行的字段总数
FS:目前的分隔符,默认是空格
lhj@lhj-virtual-machine:~$ last -n 5|awk '{print $1 "\t" $2}'
结果:
lhj pts/0
lhj tty7
(unknown tty7
reboot system
lhj tty7
lhj@lhj-virtual-machine:~$ cat /etc/passwd|awk '(FS=":") {if($3<10){print $1 "\t" $3 }}'
或者
lhj@lhj-virtual-machine:~$ cat /etc/passwd|awk -F":" '{if($3<10){print $1 "\t" $3}}'
第一条命令的结果:
root:x:0:0:root:/root:/bin/bash
daemon 1
bin 2
sys 3
sync 4
games 5
man 6
lp 7
mail 8
news 9
第二条命令的结果:
root 0
daemon 1
bin 2
sys 3
sync 4
games 5
man 6
lp 7
mail 8
news 9
第一条命令的FS是域分隔符,读第一行的时候分隔符还是默认的空格,其作用是从第二行开始生效。不过可以在FS前面增加BEGIN关键字,告诉awk要从第一行开始生效
lhj@lhj-virtual-machine:~$ cat /etc/passwd|awk 'BEGIN {FS=":"} {if($3<10){print $1 "\t" $3 }}'
root 0
daemon 1
bin 2
sys 3
sync 4
games 5
man 6
lp 7
mail 8
news 9
awk还可以做列的运算,例如
lhj@lhj-virtual-machine:~$ cat /etc/passwd|awk 'BEGIN {FS=":"} {if($3<10){s+=$3}} END {print s}'
45