使用sed / awk将CSV与CSV文件中的端口分开

时间:2014-11-15 05:24:43

标签: linux bash csv awk sed

我正在使用以下命令创建一个带有输出的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输出中实现这一点?

2 个答案:

答案 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的输出)加上给定输入的预期输出,我们可以改进/验证脚本并通常可以为您提供更多帮助。