awk
sed倾向于以行为单位进行处理,而awk更擅长将一行分为几段进行处理。
awk的语法
awk用法
| awk '条件类型1{动作1} 条件类型2{动作2} ...'
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
awk支持两种数据来源,既可以通过管道获取数据,也可以从文件获取数据。
awk主要是处理每一行的字段内的数据,而默认的字段分割符为空格或tab。分割后的每一个字段都有一个变量名来指代。第一个是$1,第二个是$2,以此类推。$0指代当前这一整行。
awk格式化输出实例
awk格式化输出
[nigel@/vbird_linux]$ last -n 5
nigel pts/32 10.41.52.111 Wed Sep 12 09:24 still logged in
tris pts/26 10.41.69.55 Tue Sep 11 22:51 still logged in
tris pts/24 10.41.69.55 Tue Sep 11 22:46 still logged in
tris pts/21 10.41.69.55 Tue Sep 11 22:41 still logged in
tris pts/20 10.41.69.55 Tue Sep 11 22:41 still logged in
[nigel@/vbird_linux]$ last -n 5 | awk '{print $1 "\t" $3}'
nigel 10.41.52.111
tris 10.41.69.55
tris 10.41.69.55
tris 10.41.69.55
tris 10.41.69.55
awk是以行为一次处理的单位,而以字段为最小的处理单位。
awk的特殊变量
awk内置了一些特殊变量,用来存储特殊信息:
- NF 每一行拥有的变量总数
- NR 目前awk所处理的行数
- FS 目前的分割字符,默认是空格
awk条件输出实例
awk条件输出
[nigel@ /vbird_linux]$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[nigel@ /vbird_linux]$ head -n 5 /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
第一行没有处理,是因为此时分割符还是默认的空格,从第二行开始才是”:”
解决方法是使用BEGIN关键字:
[nigel@ /vbird_linux]$ head -n 5 /etc/passwd | awk 'BEGIN {FS=":"} $3<10{print $1 "\t" $3}'
root 0
bin 1
daemon 2
adm 3
lp 4
需要特别注意,自定的风格符从第二行开始才会生效,所以通常我们需要加上BEGIN来让其从第一行就开始生效。
awk计算功能实例
awk也可以进行一些简单的计算
[nigel@DevTJ-todo-1507091995 ~/app/vbird_linux]$ cat pay.txt
Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 22000 23000
Bird2 43000 42000 41000
[nigel@/vbird_linux]$ cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2{total=$2+$3+$4; printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
Name 1st 2nd 3th Total
VBird 23000 24000 25000 72000.00
DMTsai 21000 22000 23000 66000.00
Bird2 43000 42000 41000 126000.00
在使用过程中需要注意以下几点:
- 所有awk动作,如果需要多个命令辅助时,可利用分号“;”间隔,或者直接以Enter换行。
- 格式化输出时,要加上\n,才能进行分行
awk高级特性
awk还有很多高级特性,如if、循环等。暂时先不接触,把基础用熟练了再说。
PS:本文章内容学习自《鸟哥的linux私房菜 基础学习篇(第三版)》,文章中的所有实例都是亲手操作,保证有效。