Help with xargs


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Help with xargs
# 1  
Old 03-15-2013
Help with xargs

Using the bash shell I'm trying to either create a command for the command line or a script that will show netstat info for a given process name. Here is an example of what I'm trying to do:
Code:
$ ps aux |grep catalina |grep -v grep | awk '{print $2}'
5132
$ netstat -nlp |grep 5132
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      5132/java       
tcp6       0      0 :::8009                 :::*                    LISTEN      5132/java       
tcp6       0      0 :::8080                 :::*                    LISTEN      5132/java       
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      5132/java

I would like to be able to use xargs such that the output from the first command is used as input to grep in the second command. How would I put all this together to have one "simple" command to search for all the ports being listened to by a particular application?

If it were put in a script I would like to be able to pass in the name of the application I'm searching for so I could run the above like this:
Code:
$ show_netstat_for_app.sh catalina

# 2  
Old 03-15-2013
Apparently catalina has its port as string 2 here, but most things won't. If you want something that works for catalina, great.

Here's a tip: Instead of doing 'grep -v grep', just make it so grep doesn't match itself in the first place by making one letter [c] instead of c -- matches the same string but doesn't match itself.

Also, whenever you're doing grep | grep | awk | kitchen | sink, you should just replace it all with one simple awk command.

Code:
#!/bin/sh

set -- `ps -aux | awk '/[c]atalina/ { print $2 }'` # $1=PID1, $2=PID2, etc
IFS="|" # Make $* be PID1|PID2|PID3 instead of PID1 PID2 PID3
netstat -nlp | egrep "($*)/" # egreps for "(PID1|PID2)/"

This User Gave Thanks to Corona688 For This Post:
# 3  
Old 03-15-2013
Quote:
Apparently catalina has its port as string 2 here, but most things won't.
I don't think this is specific to catalina. In my example, catalina was just an example of a program I was searching for. the output is actually coming from ps -aux. So, it looks like it would always be column 2 unless ps was configured to reorder the columns.

Quote:
Also, whenever you're doing grep | grep | awk | kitchen | sink, you should just replace it all with one simple awk command.
I'm also a newbie with awk. In my original post I mentioned that I would also like to have "catalina" be a parameter that I could pass into the script. If I wanted to do this search for some other application, say httpd for example, would there be an easy way to pass that in as a parameter to the script? I was thinking that using the form of
Code:
grep $1 |grep -v grep

would make it easier to replace the parameter, "catalina" in this example, with a parameter passed into the script rather than having to make the script wrap [] around the first character of $1.

What would the appropriate awk command be to search for the passed in parameter "$1" instead of searching for "/[c]atalina/" if I don't use the grep | grep -v form?

Also, is there a way to do this with xargs?
# 4  
Old 03-15-2013
Quote:
Originally Posted by axiopisty
I don't think this is specific to catalina. In my example, catalina was just an example of a program I was searching for. the output is actually coming from ps -aux. So, it looks like it would always be column 2 unless ps was configured to reorder the columns.
Oh, I thought you were somehow extracting port numbers from ps. PID's make more sense.

But if all you want is PID's, pgrep does everything in one shot without the grep -v grep problem. It's also more portable than ps aux AFAIK.

Code:
set -- `pgrep $1`
IFS="|" # Make $* be PID1|PID2|PID3 instead of PID1 PID2 PID3
netstat -nlp | egrep "($*)/" # egreps for "(PID1|PID2)/"

Quote:
Also, is there a way to do this with xargs?
xargs isn't applicable here; it's not a shell, it doesn't run pipe chains. Running netstat 12 times to find 12 different PID's would be silly, anyway.

Cramming everything into one line doesn't necessarily make it simpler or more efficient.
# 5  
Old 03-16-2013
What about this one - not yet bullet proof, may need to be adapted / improved:
Code:
$ { ps; netstat -nlp; } 2>/dev/null | awk 'match ($15, /[l]xterminal/) {TMP=$4} match ($9, TMP"/")'
unix  2      [ ACC ]     STREAM     LISTENING     73839    2512/lxterminal     /tmp/.lxterminal-socket:0-user

# 6  
Old 03-16-2013
Thank you for your replies. I can see from this seemingly simple question that I have a lot to learn about shell scripting. I don't have a clue about what is happening for either of the solutions listed.

Will you explain to me what each of the commands are doing in the solutions, or refer me to a good book for shell scripting?

Thank you.
# 7  
Old 03-17-2013
{ list; } is a group command, the components of list are executed one after the other, and all stdouts of the list are piped to awk, which first sees the ps output, checks $15 (may be different in your case) for your command name (I used "lxterminal" for testing) and retains $4 (PID) in TMP when found (not safe for multiple occurrences of cmd in ps!). Then, when the output of netstat is in the pipe, it looks for the PID in $9 and outputs each matching row.
This User Gave Thanks to RudiC For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Xargs

Hi, can anyone tell me in detail ? what the following do in detail ? I am trying to get a largest number in a list Thanks Tao LARGEST=$(echo $* | xargs -n1 | sort -nr | tail -1) (3 Replies)
Discussion started by: ccp
3 Replies

2. Shell Programming and Scripting

Xargs

Hello, I need some help with xargs $ ls aaa bbb ccc ddd$ ls | xargs -I{} ls -la {} -rw-rw-r--. 1 xxx xx 0 May 30 20:04 aaa -rw-rw-r--. 1 xxx xx 0 May 30 20:04 bbb -rw-rw-r--. 1 xxx xx 0 May 30 20:04 ccc -rw-rw-r--. 1 xxx xx 0 May 30 20:04 dddit's possible to have output like this with... (3 Replies)
Discussion started by: vikus
3 Replies

3. Shell Programming and Scripting

xargs

Dear all , any suggest on xargs to combine from (1.txt and 2.txt) to output.txt ? thanks a lot. 1.txt 0123 BUM-5M BUM-5M 93490481 63839 0124 BUM-5M BUM-5M 112112 ... (3 Replies)
Discussion started by: samoptimus
3 Replies

4. Shell Programming and Scripting

Help with xargs

hi Could any one please tell me the option using which we can run multiple commands using xargs I have list of files, I want to run dos2unix and chmod at one shot on them I tried google n searched man pages but couldnt really find the solution , please help right now im doing this ls... (4 Replies)
Discussion started by: sunilmenhdiratt
4 Replies

5. Shell Programming and Scripting

Xargs and

Hello there, Let me show you a simple example of what I am trying to achieve: 1) I have an input text file with some lines: 1 a 2 b 3 c 2) And I want to run a command with these lines as arguments (+ arbitrary extra arguments). For example: $ command "1 a" "2 b" "3 c" "bye" I... (7 Replies)
Discussion started by: tokland
7 Replies

6. Shell Programming and Scripting

Help in using xargs

Hi, I have a requirement to RCP the files from remote server to local server. Also the RCP has to run in parallel. However using 'xargs' retrives 2 file names during each loop. How do we restrict to only one file name using xargs and loop till remaining files. I use the below code for... (2 Replies)
Discussion started by: senthil3d
2 Replies

7. Shell Programming and Scripting

Using xargs

hi i just want to know that how do we use xargs command to find files which are greater than specified memory in a given directory (6 Replies)
Discussion started by: sumit the cool
6 Replies

8. UNIX for Advanced & Expert Users

xargs -P

I discovered that GNU's xargs has a -P option to allow its processes to run in parallel. Great! Is this a GNU thing, or is it supported by other platforms as well? (4 Replies)
Discussion started by: otheus
4 Replies

9. Shell Programming and Scripting

why we use xargs..

hi , can anyone help me by saying why we use xargs.. is it acing like a place holder..? thanks, Krips. (3 Replies)
Discussion started by: kripssmart
3 Replies

10. UNIX for Dummies Questions & Answers

Help with xargs

Hi there, I am trying to move around 3000 files from one directory to another. The mv command is complaining from too many arguments. I tried to use the xargs command but with no luck. Could some body provide help? Regards (4 Replies)
Discussion started by: JimJim
4 Replies
Login or Register to Ask a Question