AskJarv
AskJarv

Reputation: 184

One-liner to retrieve path from netstat port

I'm looking to create a one liner that, given a port number (2550) uses the returned value from netstat would allow me to then run the resulting output against ps -ef to return the path of the process in question. I have:

ps -ef | grep $(netstat -tonp | grep 2550 | awk '{split($7,a,"/"); print a[1]}')

and whilst I know

netstat -tonp | grep 2550 | awk '{split($7,a,"/"); print a[1]}'

returns the expected resulted, the subsequent grep tells me that there is no such file or directory (but, if I do the ps -ef | grep **) it works just fine... I'm obviously missing something... well, obvious, but I can't see what?

Upvotes: 0

Views: 912

Answers (2)

NeronLeVelu
NeronLeVelu

Reputation: 10039

try something like (it takes the first PID/port corresponding, not all):

Port=2550;ps -f --pid $( netstat -tonp |  awk -F '[ \t/]+' -v Port=$Port '$0 ~ "([0-9]+[.:]){4}" Port { PID= $7;exit}; END { print PID+0 }' ) | sed 's/^\([^ \t]*[ \t]*\)\{7\}//'

the last sed is assuming a ps reply like this (space are important):

usertest  4408  4397  0 09:43 pts/6    00:00:00 ssh -p 22 -X -l usertest 198.198.131.136

for every PID and with no ending sed:

Port=2550; ps -ef | awk -v PIDs="$( netstat -tonp |  awk -F '[ \t/]+' -v Port=${Port} '$0 ~ (":" Port) { print $7}' )" 'BEGIN{ split( PIDs, aTemp, /\n/); for( PID in aTemp) aPID[ aTemp[PID] ] }; $2 in aPID { sub( /^([^ \t]*[ \t]*){7}/, ""); print}'

Upvotes: 1

hek2mgl
hek2mgl

Reputation: 157967

This will give you the pids:

<sudo> netstat -tulpen | awk '$4 ~ /:2550$/{sub("/.*","",$NF);print $NF}'

You can use xargs to pass the pid to ps:

netstat -tulpen | awk '$4 ~ /:2550$/{sub("/.*","",$NF);print $NF}' | xargs -P 1 ps -o pid,cmd -p

Upvotes: 1

Related Questions