‘--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 11:31 AM..
Reason: use code tags please, ty
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
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 2,288
Thanks Given: 430
Thanked 480 Times in 395 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.
Hi,
here are few lines present in the logs. I want to grep on Error and print few lines before and after Error word is found
line1
Line2
Line3
Error
Line4
Line5
Line6
Line7
I want the output to be
Line2
Line3
Error
Line5 (1 Reply)
Hello,
I have two files file 1 and file 2 each having result of a query on certain database tables and need to compare for Col1 in file1 with Col3 in file2, compare Col2 with Col4 and output the value of Col1 from File1 which is a) not present in Col3 of File2 b) value of Col2 is different from... (2 Replies)
Hi Guys,
I have file like below, I want to print all lines between test1231233 to its 10 occurrence(till line 41)
test1231233
qwe
qwe
qweq123
test1231233
qwe
qwe
qweq23
test1231233
qwe
qwe
qweq123
test1231233
qwe
qwe
qweq123131 (3 Replies)
Hello everyone,
I have a little script below:
die "Usage infile outfile reGex" if @ARGV != 3;
($regex) = @ARGV;
open(F,$ARGV) or die "Can't open";
open(FOUT,"+>$ARGV") or die "Can't open";
while (<F>)
{
print FOUT if /$regex/.../$regex/;
}
No matter what I give $regex on the... (2 Replies)
I have several very large file that are extracts from Oracle tables. These files are formatted in XML type syntax with multiple entries like:
<ROW>
some information
more information
</ROW>
I want to grep for some words, then print all lines between <ROW> AND </ROW>. Can this be done with AWK?... (7 Replies)
Dear Experts,
I have file called file1 in which i am greping a pattern after that i want to next 3 lines when that pattern is matched.
Ex:- file1
USA
UK
India
Africa
Hello
Asia
Europe
Australia
Hello
Peter
Robert
Jo
i want to next 3 lines after matching Hello... (12 Replies)