我使用下面的命令在一行上输出 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$//'
但如果不知道什么输入是合法的以及什么输出是期望的,就很难说。