对于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