在命令行中使用多个 sed 语句

在命令行中使用多个 sed 语句

我使用下面的命令在一行上输出 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 -cis 删除重复项并添加计数,但由于以下awk仅使用第三个 comlun,因此无论如何都会删除计数。您可以删除并用选项-c替换整个:uniq-usort

sort -u file | awk -F " " '{print $2}' | sed ...

在这里你误用了awkfor 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 个管道的一英里长的命令行将被简化为一个简单的、只有一个管道和一个简短的脚本:sedworking IP$ dsortsed

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$//'

但如果不知道什么输入是合法的以及什么输出是期望的,就很难说。

相关内容