$ for text in ten thirteen sixteen; do awk -v wText="$text" '{a[++i]=$0} $0 ~ wText {for(j=NR-4; j<=NR; j++) {print a[j]} print "" }' number.txt; done
six
seven
eight
nine
ten
nine
ten
eleven
twelve
thirteen
BEGIN {
if (!pat) pat="ten thirteen sixteen"
if (!lines) lines=4
split(pat, tA, FS)
for(i=1;i in tA;i++)
patA[tA]
}
{ a[FNR]=$0 }
END {
for(i=1;i<=FNR;i++)
if (a in patA) {
for(j=i-lines;j<=i;j++)
print a[j]
print ""
}
}
or with specific strings to search: awk -v pat='seven fifteen' -f jv.awk numbers.txt
or to get 4 lines above awk -v pat='seven fifteen' -v lines=3 -f jv.awk numbers.txt
$ ./s1
Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 2.6.26-2-amd64, x86_64
Distribution : Debian 5.0.8 (lenny, workstation)
bash GNU bash 3.2.39
egrep GNU grep 2.5.3
cgrep ATT cgrep 8.15
-----
Input data file data1:
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
thirteen
fourteen
fifteen
-----
Results, egrep, do not expect separation of overlaps:
six
seven
eight
nine
ten
eleven
twelve
thirteen
-----
Results, cgrep, "-o" allows display of separate overlaps:
========================================
six
seven
eight
nine
ten
========================================
nine
ten
eleven
twelve
thirteen