结合 Netstat 和 PS - linux 的输出

Combine output of Netstat and PS - linux

我想合并以下命令的输出:

-NETSTAT

    [root]# netstat -nltp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 127.0.0.1:32552 0.0.0.0:*               LISTEN     
 151634/java

-PS

[root]# ps -eo pid,cmd | grep 151634
130485 grep --color=auto 151634
151634 java -classpath

我想组合以下 2 个命令并获得以下输出(txt 文件):

PORT PID CMD
123  333 java/etc
234  444 java/etcetc
345  555 java/etcetcetc

我做了以下内容:

netstat -nltp | awk '{print }' | sed -e 's/.*://' 

这会打印来自 netstat -nltp 输出的端口

for i in `netstat -nltp | awk {'print }' | awk -F '/' {'print '} | uniq` ; do ps -eo pid,cmd | grep $(echo $i | sed "s/^\(.\)/[]/g") ; done 

这从 netstat -nltp 命令获取 PID,然后从 PS 命令显示 PID 和 CMD(同时它不显示 grep --color=auto 结果

非常感谢!

LE:我删除了输出 html 以避免混淆。这只是它应该是什么样子的一个例子。

非常感谢JUSHJUSH,

我在这里写了我的回复,因为评论回复太长了。

我也用那个 FOR 更新了脚本并且它起作用了,但是,脚本似乎没有获得正确的输出。

下面我会尽量解释

如果我有以下 netstat -nltp 输出

tcp 0 0 127.0.0.1:32552 0.0.0.0:* LISTEN 151634/java tcp 0 0 10.77.66.33:8081 0.0.0.0:* LISTEN 151634/java tcp 0 0 0.0.0.0:7070 0.0.0.0:* LISTEN 151634/java tcp 0 0 0.0.0.0:9090 0.0.0.0:* LISTEN 151634/java tcp 0 0 0.0.0.0:20100 0.0.0.0:* LISTEN 151634/java tcp 0 0 0.0.0.0:20101 0.0.0.0:* LISTEN 151634/java tcp 0 0 0.0.0.0:20102 0.0.0.0:* LISTEN 151634/java

PID=151634 的 CMD 是 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar:

脚本给出以下输出: PORT PID CMD 32552 151634 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar: 32552 151634 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar: 32552 151634 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar: 32552 151634 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar: 32552 151634 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar: 32552 151634 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar: 32552 151634 java -classpath /opt/application/nifi-1.6.0/./conf:/opt/application/nifi-1.6.0/./lib/jetty-schemas-3.1.jar:

输出应该是 PORT PID CMD 32552 151634 CMD from above 8081 151634 CMD from above 7070 151634 CMD from above 9090 151634 CMD from above 20100 151634 CMD from above 20101 151634 CMD from above 20102 151634 CMD from above

或者,另一个例子:

如果我有以下 netstat -nltp 输出

tcp 0 0 127.0.0.1:3030 0.0.0.0:* LISTEN 88284/ruby tcp 0 0 127.0.0.1:3031 0.0.0.0:* LISTEN 88284/ruby

PID=88284 的 CMD 是 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-client -c /etc/sensu/config.json -d /etc/sensu/conf.d -e /etc/sensu/extensions -p /var/run/sensu/sensu-client.pid -l /var/log/sensu/sensu-client.log -L warn

脚本给出以下输出: PORT PID CMD 3030 88284 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-client -c /etc/sensu/config.json -d /etc/sensu/conf.d -e /etc/sensu/extensions -p /var/run/sensu/sensu-client.pid -l /var/log/sensu/sensu-client.log -L warn 3030 88284 /opt/sensu/embedded/bin/ruby /opt/sensu/bin/sensu-client -c /etc/sensu/config.json -d /etc/sensu/conf.d -e /etc/sensu/extensions -p /var/run/sensu/sensu-client.pid -l /var/log/sensu/sensu-client.log -L warn

输出应该是 PORT PID CMD 3030 88284 CMD from above 3031 88284 CMD from above

非常感谢您的帮助和耐心等待!

好的,我已经设法让脚本处理所有重复问题等。 您可以在下面找到更新的脚本,以备不时之需。 谢谢! :)

netstat -ntlp | sed 1,2d > /tmp/output_netstat.txt

echo PORT$'\t'PID$'\t'NAME
for port in $(cat /tmp/output_netstat.txt | awk '{print  " " }' | sed -e 's/.*://' | awk '{print }' | uniq)
do
    pid=$(cat /tmp/output_netstat.txt | grep -w "$port" | awk '{print }' | cut -d ' ' -f 7 | cut -d '/' -f 1 | uniq )
    ps_name=$(cat /tmp/output_netstat.txt | awk '{print  " " }' | sed -e 's/.*://' | sed 's/\// /g' | awk '{print }')
    ps_name_outputed=$(ps -ef | grep "$pid" | grep "$ps_name" | grep -v grep |tr -s ' '| sed 's/^[^0-9]*//g' | head -1 | cut -f2- -d/)
    echo  "$port"" ""$pid"" ""$ps_name_outputed"
done

rm -rf /tmp/output_netstat.txt