0

有没有简单的方法来打印 IP_Address:port# ?因为我一进入 SED 命令,端口 :# 就被剥离了

输入文件示例

Apr 6 14:20:41 TCP 178.255.83.1:80 in

像这样的首选输出

Apr 6 14:20:41 TCP 178.255.83.1:80 in United Kingdom
egrep -w 'TCP|UDP' $Denied_IPs |
sed 's/:[^:]* in/ in/; s/:[^:]* out/ out/' |
awk '{cmd="echo "$5" | code | fgrep 'Country:' | cut -c 16-43";
      cmd | getline rslt;
      close(cmd);
      print $1" "$2" "$3" "$4" "$5" "$6" "rslt}' >> "$IP2COUNTRY"
4

1 回答 1

1

sed命令明确剥离端口。鉴于这就是sed命令所做的全部,只需将其从表达式中删除即可。

顺便说一句,这是一个相当不理想的实现。尤其是在我们去掉 之后sedegrep可以折叠成awk

awk '/ (TCP|UDP) / {
       split($5, addr, /:/);
       cmd = "echo " addr[1] " | code | fgrep Country: | cut -c 16-43";
       cmd | getline rslt;
       close(cmd);
       print $1, $2, $3, $4, $5, $6, rslt
     }' < "$Denied_IPs" >> "$IP2COUNTRY"

我不禁认为 inside 的调用code可以awk优化一点。

(我还删除了 周围的单引号'Country:',它们没有任何用处——如果需要它们,它们实际上会破坏脚本,因为整个东西已经用单引号包裹了。)

于 2012-04-06T18:55:49.793 回答