使用awk从MacOS上的netstat输出解析ip地址

时间:2014-09-30 09:54:46

标签: macos awk

这是一个与awk相关的问题(没有perl / cut / sed ...请:))。

我实际上要做的是仅使用awk从MacOS上的netstat输出获取目标地址。

这是输出的一个例子:

$ netstat -nl -p tcp
Active Internet connections
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  127.0.0.1.26164        127.0.0.1.50100        ESTABLISHED
tcp4       0      0  127.0.0.1.50100        127.0.0.1.26164        ESTABLISHED

如果我运行awk解析器,我得到:

$ netstat -nl -p tcp | awk '/tcp/ {split($5,a,".") ; for(i=1; i<NF-1; i++) printf a[i] "."; printf "\n"}'
127.0.0.1.
127.0.0.1.

1)有没有办法删除“。”在IP地址的末尾?

2)是否有更好的“awk”方法来获得相同的结果?

PS:我知道你可以输入类似

的内容
$ netstat -nl -p tcp | perl -ape '$_=$F[4];s/((?:\d+\.){3}\d+)\D.*/$1\n/'

获得正确的结果;)

谢谢!

5 个答案:

答案 0 :(得分:1)

只需使用来自split()的元素数量:

awk '/tcp/ {n=split($5,a,".")
            ^-----------------------------------------------------------\
            for(i=1; i<n; i++) printf "%s%s", a[i], (i==n-1?"\n":".")   |
                       ^-----------------------------^^^^^^-------------/
           }'

解释

  • n=split($5,a,".")正如你所做的那样分裂,但在变量n中存储它产生的字段数量。
  • for(i=1; i<n; i++) printf "%s%s", a[i], (i==n-1?"\n":".")}循环显示这些值,根据循环时间打印点.或新行。

测试

$ netstat ... | awk '/tcp/ {n=split($5,a,"."); for(i=1; i<n; i++) printf "%s%s", a[i], (i==n-1?"\n":".")}'
127.0.0.1
127.0.0.1

答案 1 :(得分:1)

另一个回复可能更好,但这是我的尝试:

netstat -nl -p tcp | awk '/tcp/{split($5,a,".");for(x in a)if(a[x+1]""){y=y SEP a[x]; SEP="."}print y;y="";SEP=""}'

<强>解释

  • if(a[x+1]"")检查数组中是否有下一个元素(即它是否处理最后一个元素 - 端口),""通过应用连接将数字转换为字符串0 1}}不评估为False
  • SEP变量只是确保输出不会以.开头,并在结束时重置。

答案 2 :(得分:1)

我认为我喜欢这种方法有多个替代FS - 点或空格:

netstat -nl -p tcp |awk -F'[. ]*' '/tcp/{print $9,$10,$11,$12}' OFS="."

答案 3 :(得分:1)

为什么不用UNIX方式呢?将它管道到另一个实用程序:

netstat -nl -p tcp | awk '/tcp/{print $4}' | sed 's/\.[0-9]*$//'

或者,要在awk中执行整个操作,请使用sub()删除IP的最后部分:

netstat -nl -p tcp | awk '/tcp/{sub(/\.[0-9]*$/,"",$4); print $4}' 

不幸的是,BSD grep(这是OSX所拥有的)没有-P选项,否则你可以这样做:

netstat -nl -p tcp | awk '/tcp/{print $4}' | grep -oP '.*(?=\.\d+)'

答案 4 :(得分:1)

我认为这是使用awk

执行此操作的最简单,最通用的方法
 awk '{match($5,/(.*)\./,x);print x[1]}' file