Учитывая, что вы не используете GNU grep
и предполагаете, что не можете установить его, вам придется прибегнуть к другим инструментам. Это скрипт, который я назвал 'sgrep', который, как вы можете видеть из информации о дате, довольно старый, но был написан для Xenix, SunOS (предшествовавших Solaris), HP-UX, AIX и легиона других давно ушедших варианты Unix. Он выполняет работу довольно тщательно - он более всеобъемлющий, чем вам нужно в настоящее время.
: "$Id: sgrep.sh,v 1.3 1989/05/12 10:24:14 john Exp $"
#
# Special grep
# Finds a pattern and prints lines either side of the pattern
# Line numbers are always produced by ed (substitute for grep),
# which allows us to eliminate duplicate lines cleanly. If the
# user did not ask for numbers, these are then stripped out.
#
# BUG: if the pattern occurs in in the first line or two and
# the number of lines to go back is larger than the line number,
# it fails dismally.
set -- `getopt "f:b:n" "$@"`
case $# in
0) echo "Usage: $0 [-n] [-f x] [-b y] pattern [files]" >&2
exit 1;;
esac
number="'s/^\\([0-9][0-9]*\\) /\\1:/'"
filename="'s%^%%'" # No-op for sed
f=3
b=3
nflag=no
while [ $# -gt 0 ]
do
case $1 in
-f) f=$2; shift 2;;
-b) b=$2; shift 2;;
-n) nflag=yes; shift;;
--) shift; break;;
*) echo "Unknown option $1" >&2
exit 1;;
esac
done
pattern="${1:?'No pattern'}"
shift
case $# in
0) tmp=${TMPDIR:-/tmp}/`basename $0`.$$
trap "rm -f $tmp ; exit 1" 0
cat - >$tmp
set -- $tmp
sort="sort -t: -u +0n -1"
;;
*) filename="'s%^%'\$file:%"
sort="sort -t: -u +1n -2"
;;
esac
for file in $*
do
{
ed - $file <<-!
g/$pattern/.-${b},.+${f}n
!
} |
eval sed -e "$number" -e "$filename" \| $sort |
case $nflag in
yes) cat -;;
no) sed 's/[0-9][0-9]*://';;
esac
done
rm -f $tmp
trap 0
exit 0
Мне пришлось выкопать его из окаменелостей, где я храню древние программы. У меня есть Perl-скрипт, который выполняет в основном ту же работу; Я использую их не очень часто, так как обычно у меня установлен GNU grep.