这是一个与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/'
获得正确的结果;)
谢谢!
答案 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