Using GREP


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Using GREP
# 1  
Old 12-05-2010
Power Using GREP

Code:
PING www.l.google.com (209.85.135.99) 56(84) bytes of data.
From 209.85.253.26 icmp_seq=1 Time to live exceeded

--- www.l.google.com ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
I want to break out of for/while/until loop when the line begins with "64 bytes from [...]".
How do you do that?
PING www.l.google.com (209.85.135.99) 56(84) bytes of data.
64 bytes from mu-in-f99.1e100.net (209.85.135.99): icmp_req=1 ttl=250 time=45.0 ms

--- www.l.google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 45.052/45.052/45.052/0.000 ms

Grep always appends NEWLINE after its output. How do you prevent this (anything like echo -n)?

Last edited by courteous; 12-05-2010 at 05:16 PM..
# 2  
Old 12-05-2010
I don't see a for or a while loop in your ping command.
Instead of grep what about this
Code:
# filename is a file with a list of nodes  or ip addresses
while read n
do
  ( ping -c 1 $n | tr -d '\n' )
done < filename > outputfile

Otherwise explain your desired output with an example.
This User Gave Thanks to jim mcnamara For This Post:
# 3  
Old 12-05-2010
This is the code.

Hi Jim,
above isn't the code but terminal output.

This is the code (user enters target domain | defaults to google.com) which resembles traceroute:
Code:
#!/bin/bash
domain=${1-www.google.com};

for ((i=1; i<=30; i++)) # purely arbitrary (should change to WHILE loop)
do
	if [ "$i" -eq 1 ]; # only to emulate traceroute's first line
	then
		echo -n "mytraceroute to $domain ("
		ping -c 1 -t $i $domain | grep -w 'PING' | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
		echo ")" # how do I prevent NEWLINE from GREP? EDIT: Thank you very much Jim!
	fi

	ping -c 1 -t $i $domain | egrep -wv 'PING|64 bytes' | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
	echo $? # when GREP finds line that starts as "64 bytes ..." it outputs 1
	#ping -c 1 -t $i $domain # for debugging
done

GREP starts exiting with 1's once I reach the target ... but, the problem is that on the way to the target some servers fail to respond (those stars * * * in traceroute). So I can't rely on
PHP Code:
echo $? 
to tell me when to break out of the loop.

This is the output of the code (look at the trouble-maker "1" in-between):
Code:
mytraceroute to www.google.com (209.85.135.103)
192.168.1.1
0
85.10.0.254
0
95.176.241.10
0
1 # this is way I can't rely on GREP's exit code to break the loop
85.10.0.73
0
[...]
0
72.14.238.128
0
209.85.241.189
0
209.85.253.26
0
1
1
1
^C


Last edited by jim mcnamara; 12-05-2010 at 05:39 PM..
# 4  
Old 12-05-2010
prevent a newline with
Code:
grep command | tr -d '\n'
# so:
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | tr -d '\n'

# 5  
Old 12-05-2010
I did that already, I thanked you in the code's comments above. Thank you. Smilie

Below is the before-GREP output. IPs that GREP extracts are in blue.
Code:
PING www.l.google.com (209.85.135.147) 56(84) bytes of data.
From 192.168.1.1 icmp_seq=1 Time to live exceeded
--- www.l.google.com ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING www.l.google.com (209.85.135.99) 56(84) bytes of data.
From 95.176.241.10 icmp_seq=1 Time to live exceeded
--- www.l.google.com ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING www.l.google.com (209.85.135.106) 56(84) bytes of data.
# This one has "From so-and-so" line missing and makes GREP exit with a 1. Why? EDIT: Because no matches were found, obviously!
--- www.l.google.com ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

PING www.l.google.com (209.85.135.103) 56(84) bytes of data.
From 72.14.219.148 icmp_seq=1 Time to live exceeded
--- www.l.google.com ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING www.l.google.com (209.85.135.104) 56(84) bytes of data.
64 bytes from mu-in-f104.1e100.net (209.85.135.104): icmp_req=1 ttl=250 time=41.3 ms 
#finished: from here on GREP exits with 1's 

EDIT: To repeat, this output is filtered with this line:
Code:
ping -c 1 -t $i $domain | egrep -wv 'PING|64 bytes' | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'

Final question: how to make GREP not return exit status 1 on 3rd PING (the one that has this comment: # This one has "From so-and-so" line missing [...])? Smilie
That is, how should I check and break the loop when the first line "64 bytes from [...]" appears (if not using GREP's exit status with echo $?)?

Last edited by courteous; 12-05-2010 at 06:25 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Inconsistent `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l`

i have this line of code that looks for the same file if it is currently running and returns the count. `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l` basically it is assigned to a variable ISRUNNING=`ps -eaf -o args | grep -i sfs_pcard_load_file.ksh |... (6 Replies)
Discussion started by: wtolentino
6 Replies

2. UNIX for Dummies Questions & Answers

Piping grep into awk, read the next line using grep

Hi, I have a number of files containing the information below. """"" Fundallinfo 6.3950 14.9715 14.0482 """"" I would like to grep for Fundallinfo and use it to read the next line? I ideally would like to read the three numbers that follow in the next line and... (2 Replies)
Discussion started by: Paul Moghadam
2 Replies

3. UNIX for Dummies Questions & Answers

Bash - CLI - grep - Passing result to grep through pipe

Hello. I want to get all modules which are loaded and which name are exactly 2 characters long and not more than 2 characters and begin with "nv" lsmod | (e)grep '^nv???????????? I want to get all modules which are loaded and which name begin with "nv" and are 2 to 7 characters long ... (1 Reply)
Discussion started by: jcdole
1 Replies

4. Shell Programming and Scripting

AWK/GREP: grep only lines starting with integer

I have an input file 12.4 1.72849432773174e+01 -7.74784188610632e+01 12.5 9.59432114416327e-01 -7.87018212757537e+01 15.6 5.20139995965960e-01 -5.61612429666624e+01 29.3 3.76696387248366e+00 -7.42896194101892e+01 32.1 1.86899877018077e+01 -7.56508762501408e+01 35 6.98857157014640e+00... (2 Replies)
Discussion started by: chrisjorg
2 Replies

5. UNIX for Dummies Questions & Answers

Advanced grep'in... grep for data next to static element.

I have a directory I need to grep which consists of numbered sub directories. The sub directory names change daily. A file resides in this main directory that shows which sub directories are FULL backups or INCREMENTAL backups. My goal is to grep the directory for the word "full" and then... (2 Replies)
Discussion started by: SysAdm2
2 Replies

6. UNIX for Dummies Questions & Answers

Difference between grep, egrep & grep -i

Hi All, Please i need to know the difference between grep, egrep & grep -i when used to serach through a file. My platform is SunOS 5.9 & i'm using the korn shell. Regards, - divroro12 - (2 Replies)
Discussion started by: divroro12
2 Replies

7. Shell Programming and Scripting

grep for certain files using a file as input to grep and then move

Hi All, I need to grep few files which has words like the below in the file name , which i want to put it in a file and and grep for the files which contain these names and move it to a new directory , full file name -C20091210.1000-20091210.1100_SMGBSC3:1000... (2 Replies)
Discussion started by: anita07
2 Replies

8. UNIX for Dummies Questions & Answers

| help | unix | grep (GNU grep) 2.5.1 | advanced regex syntax

Hello, I'm working on unix with grep (GNU grep) 2.5.1. I'm going through some of the newer regex syntax using Regular Expression Reference - Advanced Syntax a guide. ls -aLl /bin | grep "\(x\)" Which works, just highlights 'x' where ever, when ever. I'm trying to to get (?:) to work but... (4 Replies)
Discussion started by: MykC
4 Replies

9. UNIX for Dummies Questions & Answers

| help | unix | grep - Can I use grep to return a string with exactly n matches?

Hello, I looking to use grep to return a string with exactly n matches. I'm building off this: ls -aLl /bin | grep '^.\{9\}x' | tr -s ' ' -rwxr-xr-x 1 root root 632816 Nov 25 2008 vi -rwxr-xr-x 1 root root 632816 Nov 25 2008 view -rwxr-xr-x 1 root root 16008 May 25 2008... (7 Replies)
Discussion started by: MykC
7 Replies

10. Shell Programming and Scripting

MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else

Hi Guys, I need to set the value of $7 to zero in case $7 is NULL. I've tried the below command but doesn't work. Any ideas. thanks guys. MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else { print $7}}' ` Harby. (4 Replies)
Discussion started by: hariza
4 Replies
Login or Register to Ask a Question