对于awk的使用一直处于一个打印文件域的阶段,对于sed和awk没有深究过,有本书是专门讲解awk和sed的《awk and sed》。以为学习shell脚本只要稍微能打印出文件中的某一个域就行了。结果今天碰到钉子了。
有个test的内容如下:
cat test.txt 192.168.0.18 1121 1122 192.168.0.19 2122 3232 3356 192.168.0.20 1112
要使用awk语句,将输出的结果变成如下的内容:
192.168.1.1:9009 192.168.2.1:1010 192.168.2.1:2023 192.168.2.1:4030 192.168.3.1:1990 192.168.3.1:3902 192.168.4.1:9090 192.168.4.1:2433
这个就是一个awk的正则匹配的问题。可是苦苦想不出来该怎么匹配。最后又人给出如下的匹配规则,特此记录一下:
cat test.txt 192.168.0.18 1121 1122 192.168.0.19 2122 3232 3356 192.168.0.20 1112 awk '{if($0 ~ /192.168./)ip=$0; else {port=$0; printf("%s:%s\n", ip, port)} }' test.txt 192.168.1.1:9009 192.168.2.1:1010 192.168.2.1:2023 192.168.2.1:4030 192.168.3.1:1990 192.168.3.1:3902 192.168.4.1:9090 192.168.4.1:2433
同样还有一条更简洁的命令
[root@localhost ~]# awk '/\./ {fo=$0;next} {print fo":"$0;}' test.txt 192.168.0.18:1121 192.168.0.18:1122 192.168.0.19:2122 192.168.0.19:3232 192.168.0.19:3356 192.168.0.20:1112
用sed也有一条命令:
[root@localhost ~]# sed -n '/^192/{h}; /^192/!{G;s/\([^\n]*\)\n\(.*\)/\2:\1/;p}' test.txt 192.168.0.18:1121 192.168.0.18:1122 192.168.0.19:2122 192.168.0.19:3232 192.168.0.19:3356 192.168.0.20:1112