簡體   English   中英

使用sed / awk從CSV文件中的端口中分離IP

[英]Seperate IP from port in CSV file using sed/awk

我正在使用以下創建具有如下所示輸出的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輸出中實現呢?

您可以合理確定輸出中將不包含:/ 因此,只需將這些字符替換為選項卡即可:

... 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,但是如果有,則必須調整索引以使其包含在內。

就像您先前的問題一樣,您正在解決所有錯誤。 您不需要一堆單獨的命令和管道。 您甚至不需要多個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的輸出)加上給定輸入的預期輸出,我們可以改進/驗證腳本並通常為您提供更多幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM