![](/img/trans.png)
[英]Pipe urls from xml into seperate file in Linux, using sed, awk, cat or grep
[英]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.