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

使用awk解析MacOS上netstat输出的ip地址,macos,awk,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

这是一个与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.
得到正确的结果


谢谢

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


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


另一个回答可能更好,但我的尝试如下:

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=""}'
解释

ifa[x+1]检查数组中是否存在下一个元素,即是否未处理最后一个元素-端口,并通过应用串联将数字转换为字符串,以便0的计算结果不为False SEP变量只是确保输出不会以a开头,并在最后重置。
另一个回答可能更好,但我的尝试如下:

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=""}'
解释

ifa[x+1]检查数组中是否存在下一个元素,即是否未处理最后一个元素-端口,并通过应用串联将数字转换为字符串,以便0的计算结果不为False SEP变量只是确保输出不会以a开头,并在最后重置。
我想我更喜欢这种带有多个可选FS的方法-点或空格:

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

我想我更喜欢这种带有多个可选FS的方法-点或空格:

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

为什么不用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}' 
不幸的是,OSX的BSD grep没有-p选项,否则您可以执行以下操作:

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

为什么不用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}' 
不幸的是,OSX的BSD grep没有-p选项,否则您可以执行以下操作:

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

我认为这是使用awk实现这一点最简单、最通用的方法

 awk '{match($5,/(.*)\./,x);print x[1]}' file

我认为这是使用awk实现这一点最简单、最通用的方法

 awk '{match($5,/(.*)\./,x);print x[1]}' file

@软呢帽,谢谢你!我看错了问题-实际上理解他想要第4-7栏:-谢谢,两种方式我都喜欢。我无法使用OFS。。。我错过了分离字段选项中的星号。@fedorqui Ooops,谢谢!我看错了问题-实际上理解他想要第4-7栏:-谢谢,两种方式我都喜欢。我无法使用OFS。。。我错过了分离字段选项中的星号。这对于a中的我可能会导致问题。看见由于顺序问题,我建议您坚持使用fori=0;我语法。在我的机器上工作。开玩笑的,但我尝试了一组更大的输入,它仍然没有随机化。使用GNUAWK4.1。是的,我明白了,但你永远不会知道。另外,我建议添加一些大括号,以便更清楚地说明a{ifa[x+1]{y=y SEP a[x]}SEP=.}print y;y=;SEP=}文件中for->awk'/tcp/{split$5,a,;forx的范围是什么。我不太喜欢这个解决方案,因为SEP会重复分配,最好利用split的输出。但是,解释为+1。这对于a中的i可能会导致问题。看见由于顺序问题,我建议您坚持使用fori=0;我语法。在我的机器上工作。开玩笑的,但我尝试了一组更大的输入,它仍然没有随机化。使用GNUAWK4.1。是的,我明白了,但你永远不会知道。另外,我建议添加一些大括号,以便更清楚地说明a{ifa[x+1]{y=y SEP a[x]}SEP=.}print y;y=;SEP=}文件中for->awk'/tcp/{split$5,a,;forx的范围是什么。我不太喜欢这个解决方案,因为SEP会重复分配,最好利用split的输出。但是,解释为+1。实际上不适用于awk,但适用于gawk。无论如何,这正是我所想的,最短最优雅的解决方案:。谢谢实际上不适用于awk,但适用于gawk。无论如何,这正是我所想的,最短最优雅的解决方案:。谢谢