使用awk解析MacOS上netstat输出的ip地址
这是一个与awk相关的问题,没有perl/cut/sed。。。请: 我实际上想做的是仅使用awk从MacOS上的netstat输出中获取目标地址 下面是一个输出示例:使用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
$ 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。无论如何,这正是我所想的,最短最优雅的解决方案:。谢谢