如何在sed命令之前打印IP_ADDRESS:port#

时间:2012-04-06 18:46:14

标签: bash

是否有一种简单的方法来打印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"

1 个答案:

答案 0 :(得分:1)

sed命令显式剥离端口。鉴于这是sed命令正在执行的操作,只需将其从表达式中删除即可。

顺便说一下,这是一个相当不理想的实现。特别是在我们移除sed后,egrep可以折叠到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"

我不禁想到codeawk的调用可以稍微优化一下。

(我还删除了'Country:'周围的单引号,它们没有任何用处 - 如果他们已经需要,他们实际上已经破坏了脚本,因为整个事情是已用单引号括起来。)