我正在使用以下命令创建一个带有输出的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输出中实现这一点?
答案 0 :(得分:1)
您可以合理地确定输出在该行的任何其他位置都不会包含:
或/
。所以只需用标签替换这些字符:
... output | sed 's/:/\t/g' | sed 's/\//\t/g'
现在你的所有字段都是分开的。只需使用awk以您想要的方式更改排序:
... output | sed 's/:/\t/g' | sed 's/\//\t/g' | awk '{print $1, $2, $3, $4, $5, $6, $7}'
以上内容将跳过您不想要的$8
,并且我没有在您的输入中看到主机IP,但如果您有,则必须调整索引以包含它。< / p>
答案 1 :(得分:1)
与上一个问题一样,你接近这一切都是错误的。您不需要一堆单独的命令和管道。您甚至不需要多个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的输出)加上给定输入的预期输出,我们可以改进/验证脚本并通常可以为您提供更多帮助。