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

标签 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 输出中实现这一点的任何指示?

最佳答案

与您之前的问题一样,您的处理方式完全错误。您不需要一堆单独的命令和管道。您甚至不需要多个 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/

相关文章:

java - 从 Linux shell 读取输出并将其存储到 JSON 对象

linux - 如何计算Linux中一个进程及其所有子进程的CPU利用率?

c++ - 警告 : cannot find entry symbol _start - while compiling to . 所以

javascript - 如何使用 Javascript 根据时间循环遍历 HTML 表

magento - 如何在 magento 中导入时事通讯订阅者用户 csv

将带有嵌入引号的 csv 文件读入 R

linux - 使用 tee 记录 ssh session 并为用户命令解析文件

bash - 如何使 jq 将参数视为数字而不是字符串?

linux - 在 csv 命令输出的列后选择值

linux - Bash 脚本,将输出重定向到另一个目录