awk:一行中分成数个字段来处理,适合处理小型的数据处理。
运作模式
awk '条件类型1{动作1} 条件类型2{动作2}...'filename
默认的分隔符号是空格 和Tab键
举例:
[root@test001 tmp]# last -n 5
root pts/2 114.85.202.207 Wed Nov 4 11:04 still logged in
root pts/1 114.85.202.207 Wed Nov 4 10:28 still logged in
root pts/1 114.85.202.207 Wed Nov 4 10:07 - 10:28 (00:20)
root pts/3 114.85.202.207 Tue Nov 3 15:02 - 17:48 (02:46)
root pts/2 114.85.202.207 Tue Nov 3 14:37 - 16:54 (02:16)
wtmp begins Tue Apr 7 10:19:30 2020
取出近期登录的前5条信息
取出登入者的账号和IP中间用tab隔开
[root@test001 tmp]# last -n 5 | awk '{print $1 "\t" $3}'
root 114.85.202.207
root 114.85.202.207
root 114.85.202.207
root 114.85.202.207
root 114.85.202.207
wtmp Tue
awk的处理流程
- 读入第一行,并将第一行的资料填入
1,$2..等等变量中;
- 依据条件限制来判断是否进行后面的动作
- 做完所有条件类型和动作
4.若还有后续的行数据,则重复上面1-3的步骤,直到所有数据都读取完。
awk的内建函数
NF 每一行($0)拥有的字段总数
NR 目前awk处理的是”第几行“数据
FS 目前的分隔符,默认是空格键。
例子:
使用 last -n 5 命令来练习,如我们想要:
- 列出每一行的账号($1)
- 列出目前处理的行数(awk内的变量NR)
- 并且说明改行有多少字段(awk内的NF变量)
[root@test001 ~]# last -n 5
root pts/1 218.80.192.233 Wed Nov 4 14:33 still logged in
root pts/2 114.85.202.207 Wed Nov 4 11:04 - 14:01 (02:57)
root pts/1 114.85.202.207 Wed Nov 4 10:28 - 13:07 (02:39)
root pts/1 114.85.202.207 Wed Nov 4 10:07 - 10:28 (00:20)
root pts/3 114.85.202.207 Tue Nov 3 15:02 - 17:48 (02:46)
[root@test001 ~]# last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:" NF}'
root lines:1(行数) columns:10(该行字段数)
root lines:2 columns:10
root lines:3 columns:10
root lines:4 columns:10
root lines:5 columns:10
lines:6 columns:0
wtmp lines:7 columns:7
awk的逻辑运算字符
">" 大于
"<" 小于
">=" 大于等于
"<=" 小于等于
"==" 等于
"!=" 不等于
例子
查阅该文件中的第一和第三字段列,并且第三栏小于10以下的数据。只显示第一和第三栏
[root@test001 ~]# cat /etc/passwd | awk -F: '$3<10 {print $1 "\t" $3}'
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
''
计算每个人的总额 并打印标准输出
第一行只是说明,所以第一行不加总只是(NR==1 时处理)
第二行以后会出现加总的情况(NR>=2)
[root@test001 ~]# cat printf.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 Chinese English Mash Total
DmTsai 80 60 92 232.00
VBird 75 55 80 210.00
Ken 60 90 70 220.00
0 0 0 0.00
网友评论