|
awk支持正则表达式 我们再来看几个字符串匹配的示例: 匹配以sh结尾的行,显示第一和第七段数据
1
2
3
| [iyunv@www ~]# awk -F: '$7~/sh$/{print $1,$7}' OFS="\t" /etc/passwd
root /bin/bash
mysql /bin/bash
|
~表示匹配模式开始,$7~/模式/就是指定第七列匹配模式 1
2
3
| [iyunv@www ~]# awk -F: '$7~/sh$/{print $1,$7}' OFS="\t" /etc/passwd
root/bin/bash
mysql/bin/bash
|
!~表示取反 1
2
3
4
5
| [iyunv@www ~]# awk -F: '$7!~/sh$/{print $1,$7}' OFS="\t" /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
|
控制语句 if-else 语法:if(condition){then-body}else{[else-body]} 区分Admin和Common User
1
2
3
4
5
6
| [iyunv@www ~]# awk -F: '{if ($1=="root")print $1,"Admin";else print $1,"Common User"}' /etc/passwd
root Admin
bin Common User
daemon Common User
adm Common User
lp Common User
|
显示前5行中账户字符数大于等于4的账户
1
2
3
| [iyunv@www ~]# awk -F: 'NR<=5{if(length($1)>=4){print $1}}' /etc/passwd
root
daemon
|
函数length([string])的功能是返回string字符串字符的个数。 length($1)指变量$1记录的数据的字符个数
for循环可以用来遍历数组元素: 1
2
3
4
5
6
| [iyunv@www ~]# awk -F: '{BASH[$NF]++}END{for(A in BASH)print A,BASH[A]}' /etc/passwd
/sbin/shutdown 1
/bin/bash 2
/sbin/nologin 27
/sbin/halt 1
/bin/sync 1
|
NF读取本行字段数,$NF读取本行最后一个字段数据,BASH[$NF]把$NF读取的数据保存为BASH数组的一个元素,读取到相同元素时数组元素值递增,for循环遍历各数组元素,最后输出元素和元素值 由上例所示:当读到第一个元素/bin/bash,则BASH[/bin/bash]=1,继续往下读,下一个是/sbin/nologin, BASH[/sbin/nologin]=1,再往后读如果是/bin/bash,BASH[/bin/bash]则加1;如果是/sbin/nologin,BASH[/sbin/nologin]加1;如果有新元素则增加新元素。
awk的内置函数 split(string,array[,fieldsep[,seps]]) 功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从1开始的序列 查看存储超过20%的设备
1
2
3
| [iyunv@www ~]# df -lh | awk '!/^File/{split($5,percent,"%");if(percent[1]>=20)print $1,$5}'
/dev/sda2 22%
/dev/sda1 28%
|
|