awk连载6: awk for循环

语法

for(变量初始值;变量的范围;变量增长){操作}

比如 for(i=1;i<=10;i++){操作}, 意思是i一开始为1,每次增长1,且小于10

这种循环可以用于对 行的每个字段进行循环,所以如果想找出每行中特定的字符,就可以用此循环。如下面的例子

dd.txt内容如下:

[root@vms63 ~]# cat dd.txt

aaa xxx /xy/x111.pl afaf

/xy/x222.pl asssss aaaff ssss

111 333 aaa /xy/x23.pl afa

[root@vms63 ~]#

 

现在想找出每行中符合/xy/xNNN.pl (此处N为数字)格式的字符串,可以用如下命令实现:

[root@vms63 ~]# awk '{

> for(i=1;i<=NF;i++){

> if($i ~ /\/xy\/x[0-9]+\.pl/){print $i}

> }

> }' dd.txt

/xy/x111.pl

/xy/x222.pl

/xy/x23.pl

[root@vms63 ~]#

 

解释:

[root@vms63 ~]# awk '{

> for(i=1;i<=NF;i++){

if($i ~ /\/xy\/x[0-9]+\.pl/){print $i;next}

> }

> }' dd.txt

 

当读某取一行的时候,对这一行的每个字段进行循环,首先定义i=1,即从第一个字段开始执行{}里的内容,即判断是否含有/xy/xNNN.pl格式的字符(用\/xy\/x[0-9]+\.pl表示),如果有则打印$1。然后判断第二个字段是否含有/xy/xNNN.pl格式的字符,如果有则打印$2。直到此行最后一个字段(NF是每行的分段数)。

此效果用Perl来实现的话会容易:

[root@vms63 ~]# cat dd.txt | perl -e 'while(<>){if (/\/xy\/x\d+\.pl/){print "$&\n"}}'

/xy/x111.pl

/xy/x222.pl

/xy/x23.pl

[root@vms63 ~]#

相关新闻

发表回复

Please Login to Comment

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

                                                                                                                                    RHCE9学习指南全部更新完成,点击阅读