我正在使用以下内容创建一个 csv,其输出如下所示。现在,我想从输出的 csv 中拆分不同列中的 ip 地址和端口名称,并在最后一列中仅显示进程 ID。
脚本是:-
netstat -anputw | awk '{if ($1 == "tcp") print $1,",",$4,",",$5,",",$6,",",$7}' > $HOME/MyLog/connections_$HOSTNAME.csv
netstat -anputw | awk '{if ($1 == "udp") print $1,",",$4,",",$5,",",",",$6}' >> $HOME/MyLog/connections_$HOSTNAME.csv
CSV 格式的输出如下:-
tcp 127.0.0.1:25 0.0.0.0:* LISTEN 1112/sendmail
tcp 192.168.0.38:22 192.168.10.143:62998 ESTABLISHED 3084987/sshd
现在,我希望拆分 ip 地址和端口(逗号分隔)并从最后一列修剪文本并仅显示进程 ID。最后,此 CSV 的第一列应该是运行脚本的主机名的 IP 地址(显示在每一行中)。因此,输出将如下所示:-
192.168.0.22 tcp 127.0.0.1 25 0.0.0.0 * LISTEN 1112
192.168.0.22 tcp 192.68.0.38 22 192.168.10.143 62998 ESTABLISHED 3084987
关于如何在 csv 输出中实现这一点的任何指示?
最佳答案
与您之前的问题一样,您的处理方式完全错误。您不需要一堆单独的命令和管道。您甚至不需要多个 awk 命令。您可以用一个简单的 awk 命令做任何您想做的事情。
您没有向我们提供 netsat
的输出,因此我们可以看到 awk 输入的样子,所以这只是粗略的猜测,但您需要的是:
netstat -anputw |
awk '
BEGIN {FS="[ :/]"; OFS=","}
$1 == "tcp" {x=$8; y=$9}
$1 == "udp" {x=""; y=$8}
{print $4,$1,$5,$6,$7,x,y}
' > $HOME/MyLog/connections_$HOSTNAME.csv
如果你愿意,可以用更有意义的名称替换“x”和“y”,我只是不知道这些值代表什么。
如果您更新您的问题以显示示例输入(即来自 netstat 的输出)以及给定该输入的预期输出,我们可以改进/验证脚本并通常为您提供更多帮助。
关于linux - 使用 sed/awk 将 CSV 文件中的 IP 与端口分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942867/