
我使用下面的命令在一行上輸出 IP 位址列表,並在每個 IP 後面添加“工作 IP”語句
cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' | sed 's/$/ working IP/' | sed -e '0,/ working IP/ s/ working IP//' | sed '$ d' | paste -s -d ' ' | sed 's/working IP$//'
輸出如下圖所示:
147.123.41.112 working IP 129.138.70.113 working IP 173.230.45.54 working
IP 133.218.250.56 working IP 136.203.152.128 working IP 117.22.29.254
working IP 117.3.11.111 working IP 127.59.131.236
我多次將其通過管道傳輸到 sed 中,以使其看起來像我想要的那樣。有沒有比多次使用 sed 更好的方法?
答案1
這不僅僅是組合多個sed
命令(賈森在他的回答中解釋了這一部分)。您可以了解更多:
cat file | sort ...
cat
不需要,因為您可以給出sort
文件名,之前不需要cat
,但是可以
sort file | uniq -c | awk ...
uniq -c
is 刪除重複項並新增計數,但由於以下awk
僅使用第三個 comlun,因此無論如何都會刪除計數。您可以刪除並用選項-c
替換整個:uniq
-u
sort
sort -u file | awk -F " " '{print $2}' | sed ...
在這裡你誤用了awk
for cut -d" " -f 2
,但你可以自由地這樣做。但現在您也可以繼續使用awk
或執行該步驟sed
。無需切換工具即可在每個工具中同等完成的任務:
sort -u file | sed 's/[^ ]* *\([^ ]*\).*/\1 working IP/' ...
在不知道輸入檔的情況下,這裡開始變得奇怪。但是,如果您要追加working IP
到每一行,然後將範圍內的所有行刪除,直到第一次出現為止,則它應該與在除第一行之外的所有行上追加相同:
sort -u file | sed 's/[^ ]* *//;s/ .*//;1!s/$/ working IP/'
接下來,透過收集保留空間中的行,然後用空格替換第一個換行符,將所有其他行替換為 ,paste
可以輕鬆地將 包含在其中。同時可以刪除最後一行 ( ),因此包含 6 個不同命令和 8 個管道的一英里長的命令列將簡化為一個簡單的、只有一個管道和一個簡短的腳本:sed
working IP
$ d
sort
sed
sort -u file | sed 's/[^ ]* *//;s/ .*//;$!{H;1h;d;};x;s/\n/ /;s// working IP /g'
無需花費一生的時間來閱讀man
頁面中的選項並分析每個階段發生的情況即可獲得相同的結果。
答案2
可能可以像這樣組合前三個 sed 調用
cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' |
sed 's/$/ working IP/;s/ working IP//; $ d' | paste -s -d ' ' |
sed 's/working IP$//'
但如果不知道什麼輸入是合法的以及什麼輸出是期望的,就很難說。