AIX equivalent to GNU grep's -B and -A [print lines after or before matching lines] | Unix Linux Forums | Shell Programming and Scripting

  Go Back    


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

AIX equivalent to GNU grep's -B and -A [print lines after or before matching lines]

Shell Programming and Scripting


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 04-26-2010
slashdotweenie slashdotweenie is offline
Registered User
 
Join Date: Apr 2010
Last Activity: 23 July 2014, 7:55 AM EDT
Posts: 91
Thanks: 17
Thanked 3 Times in 3 Posts
AIX equivalent to GNU grep's -B and -A [print lines after or before matching lines]

Hi folks

I am not allowed to install GNU grep on AIX.

Here my code excerpt:

Code:
grep_fatal () {
        /usr/sfw/bin/gegrep -B4 -A2 "FATAL|QUEUE|SIGHUP"
}

Howto the same on AIX based machine?

from manual GNU grep

Code:
‘--after-context=num’
    Print num lines of trailing context after matching lines.
‘-B num’
‘--before-context=num’
    Print num lines of leading context before matching lines.


Last edited by zaxxon; 04-26-2010 at 10:31 AM.. Reason: use code tags please, ty
Sponsored Links
    #2  
Old 04-26-2010
zaxxon's Avatar
zaxxon zaxxon is offline Forum Staff  
code tag tagger
 
Join Date: Sep 2007
Last Activity: 24 October 2014, 2:41 AM EDT
Location: St. Gallen, Switzerland
Posts: 6,237
Thanks: 121
Thanked 453 Times in 412 Posts
In this case you might have to write something in awk for example to have a similar functionality.
Althoug there is an old version of GNUgrep in the official IBM Linux toolbox available, just in case you were allowed to install this one.

---------- Post updated at 05:32 PM ---------- Previous update was at 04:30 PM ----------

Without focus on parsing input etc., here a solution in awk how it could look like:

Code:
$> cat infile
bla 1
bla 2
bla 3
bla 4
bla 5
bla 6
bla 7
bla 8
bla 9
bla 10


$cat mach.ksh
awk -v direction="$1" -v offset="$2" -v pattern="$3" '

$0 ~ pattern {s=NR; _[NR]=$0; next}
{_[NR]=$0; next}

END{
        if( direction == "B" ){
                x=(s-offset)
                while( s >= x ){
                        print _[x]
                        x++
                }
        }
        if( direction == "A" ){
                x=(s+offset)
                while( s <= x ){
                        print _[s]
                        s++
                }
        }
}' $4

Examples:

Code:
$> ./mach.ksh B 2 'bla 5' infile
bla 3
bla 4
bla 5
$> ./mach.ksh A 4 'bla 5' infile
bla 5
bla 6
bla 7
bla 8
bla 9

Sponsored Links
    #3  
Old 04-27-2010
drl's Avatar
drl drl is offline Forum Advisor  
Registered Voter
 
Join Date: Apr 2007
Last Activity: 23 October 2014, 8:26 PM EDT
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 1,685
Thanks: 42
Thanked 197 Times in 179 Posts
Hi.

You can use a perl work-alike, for example, wgrep, a windowing-grep. It is not a "call-alike" because the options are somewhat different. Here's a sample run on AIX 5.1:

Code:
#!/usr/bin/env bash

# @(#) s2       Demonstrate grep-like perl code "wgrep".
# See: http://sysunconfig.net/unixtips/wgrep.txt
# See also "ack": http://betterthangrep.com/

# Infrastructure details, environment, commands for forum posts. 
# Uncomment the export to run script as external user.
# export PATH="/usr/local/bin:/usr/bin:/bin"
set +o nounset
pe() { for i;do printf "%s" "$i";done; printf "%s\n"; }
LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe ; pe "Environment: LC_ALL = $LC_ALL, LANG = $LANG"
pe "(Versions displayed with local utility \"version\")"
c=$( ps | grep "^ $$" | awk '{print $4}' )
version >/dev/null 2>&1 && s=$(_eat $0 $1) || s=""
[ "$c" = "$s" ] && p="$s" || p="$c"
version >/dev/null 2>&1 && version "=o" $p perl ./wgrep
set -o nounset
pe

FILE=${1-data1}

# Display data file:"
cat $FILE

pe
pe " Expected results:"
cat expected-output.txt

pe
pe " Results:"
# ./ack -B 2 -A 1 corge $FILE | 
./wgrep -w2:1 -m corge $FILE |
tee t1

# Check results.

pe
pe " Comparison with desired results:"
if cmp expected-output.txt t1
then
  pe " Passed -- files are same."
else
  pe " Failed -- files differ -- details:"
  diff expected-output.txt t1
fi

exit 0

producing:

Code:
$ ./s2

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: AIX, 1, 000641284C00
GNU bash 3.00.16
perl 5.6.0
./wgrep wgrep 1.1

foo
bar
baz
qux
quux
corge
grault
garble
warg
fred
plugh
xyzzy
thud

 Expected results:
qux
quux
corge
grault

 Results:
qux
quux
corge
grault

 Comparison with desired results:
 Passed -- files are same.

So you could place wgrep in a directory in your PATH, say ~/bin, and use it directly.

There is a even better work-alike, "ack", that has many of the same options as GNU grep. That is also in perl, and it ran correctly in Linux, hp-ux, and Solaris. Regrettably, it did not run on the AIX 5.1 that I use -- but perhaps it would run on yours.

The URLs in the script comments point to the sites where you can get the code.

If you do not have or know how to create a ~/bin and place it into your PATH, please do some research -- that is a far more general question, but not difficult once one understands the principles involved.

Best wishes ... cheers, drl
    #4  
Old 04-27-2010
Ygor's Avatar
Ygor Ygor is offline Forum Advisor  
Advisor
 
Join Date: Oct 2003
Last Activity: 2 May 2014, 7:14 AM EDT
Location: 54.23, -4.53
Posts: 1,801
Thanks: 1
Thanked 112 Times in 98 Posts
http://www.unix.com/302098992-post2.html
Sponsored Links
    #5  
Old 04-28-2010
ahmad.diab's Avatar
ahmad.diab ahmad.diab is offline
Registered User
 
Join Date: May 2008
Last Activity: 7 October 2014, 7:38 AM EDT
Location: Amman Jordan in MEA
Posts: 645
Thanks: 2
Thanked 19 Times in 19 Posts
Using PERL -s option will allow you to emulate the GNU grep function as below:-

cat perlgrep


Code:
#!/bin/perl -s -wln 

our ( $A , $B , $pattern ) ;

        BEGIN{
                defined $A or $A=0 ; defined $B or $B=0 ; defined $pattern or warn "Pattern Not Exists, kindly insert Pattern $!;" and exit 255 ;
        }

                        $FLINE{$.}=$_ ;

                        /$pattern/ and   $match=$. ;

        END{

                         $b = $match - $B ;
                         $a = $match + $A ;

                while ( $b < $match) {
                        print $FLINE{$b} ;
                        $b++ ;
                }

                print $FLINE{$match} ;

                while ( $a > $match ) {
                        print $FLINE{++$match};

                }
        }

in command user prompt write the below:-

Code:
bash-3.00$ chmod u+x perlgrep
bash-3.00$ perlgrep -A=2 -B=4 -pattern='FATAL|QUEUE|SIGHUP' infile.txt


Last edited by ahmad.diab; 04-28-2010 at 11:58 AM..
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
pattern matching lines using the date, and then joining the lines eo29 Shell Programming and Scripting 6 03-02-2010 06:25 AM
How to print file without few exactly matching lines? ananyob Shell Programming and Scripting 2 01-15-2010 02:43 PM
Script on pattern matching and print lines and export to excel shaliniyadav Shell Programming and Scripting 34 07-09-2009 01:45 AM
I want to print next 3 lines after pattern matching. naree Shell Programming and Scripting 12 05-21-2009 03:04 AM
Print block of lines matching a pattern vanand420 Shell Programming and Scripting 1 09-29-2008 05:09 AM



All times are GMT -4. The time now is 08:43 AM.