bash shell: echo 3 输出 netstat 列表到 3 列

bash shell: echo 3 list of output netstat to 3 column

大家好,我有一个这样的脚本shell:

#!/bin/bash
netstatport80=`netstat -an|grep :80 |awk '!/:8080/'|awk '!/:8081/' |awk '{print }'|cut -d":" -f1|sort|uniq -c|sort -rn| grep -v "0.0.0.0"`

netstatport443=`netstat -an|grep :443 |awk '!/:8080/'|awk '{print }'|cut -d":" -f1|sort|uniq -c|sort -rn| grep -v "0.0.0.0"`

netstatESTA=`netstat -an|grep ESTA |awk '!/:8080/'|awk '{print }'|cut -d":" -f1|sort|uniq -c|sort -rn| grep -v "0.0.0.0"`

echo '
List IP request port 80:    List IP request port 443:    List IP request ESTA:
'$netstatport80'            '$netstatport443'           '$netstatESTA'

'

我怎么能有这样的输出:

List IP request port 80:    List IP request port 443:    List IP request ESTA:
123.x.x.x                    183.x.x.x                   153.x.x.x
193.x.x.x                    123.x.x.x                   164.x.x.x
130.x.x.x                    103.x.x.x                   101.x.x.x
187.x.x.x                    173.x.x.x                   185.x.x.x

感谢大家的帮助!

paste 是满足您需要的标准工具,它将多个文件连接成列:

$ echo """A
> a
> a
> a""" > A.txt

$ echo """B
> b
> b""" > B.txt

$ echo """C
> c
> c
> c
> c
> c""" > C.txt

$ paste A.txt B.txt C.txt
AAAA    BB      C
a       b       c
a       b       c
a               c
a               c
a               c
                c
                c

它适用于文件,因此您应该将过滤后的 netstat 命令的输出写入文件,或者您可以使用匿名管道:

paste <(echo "List IP request port 80:"; echo "$netstatport80") <(echo "List IP request port 443:"; echo "$netstatport443") <(echo "List IP request ESTA:"; echo "$netstatESTA")

如果不同列的大小破坏了格式,您可以使用 paste-d 选项指定列之间的分隔符,然后使用 column 工具重新格式化它们,或尝试使用 pr 将截断特定大小的列(请参阅下面我的回答的先前版本)。


编辑:使用 pr 的旧答案,这是过分的且鲜为人知。

看起来你可以使用 pr 'merge' -m 选项:

$ echo """A
> a
> a
> a""" > A.txt

$ echo """B
> b
> b""" > B.txt

$ echo """C
> c
> c
> c
> c
> c""" > C.txt

$ pr -mT A.txt B.txt C.txt
A                       B                       C
a                       b                       c
a                       b                       c
a                                               c
                                                c
                                                c

pr 是我在研究您的问题时在 this SO answer 中发现的寻呼机,它的 -m 标志满足您的需要,它的 -T 选项禁用页面格式(页眉、页脚,也许还有更多?)。
它从文件中获取输入,所以你必须将过滤后的 netstat 命令的输出重定向到文件而不是使用变量,除非你想打扰匿名管道:

pr -mT <(echo "List IP request port 80:"; echo "$netstatport80") <(echo "List IP request port 443:"; echo "$netstatport443") <(echo "List IP request ESTA:"; echo "$netstatESTA")