Это не представляется возможным с grep или GNU grep.Однако это возможно при использовании стандартных инструментов POSIX и хорошей оболочки, такой как bash, в качестве рычага для получения желаемого результата.
Примечание: для решения не нужны ни python, ни perl.В худшем случае используйте awk или sed.
Одно из решений, которое я быстро создал на прототипе, выглядит примерно так (оно включает в себя издержки на повторное чтение файла, и это решение зависит от того, допустимы ли эти издержки, иподдавка - это исходный вопрос об использовании -1 в качестве фиксированного числа строк контекста, что позволяет просто использовать head & tail):
$ OIFS="$IFS"; lines=`grep -n match greptext.txt | /bin/cut -f1 -d:`;
for l in $lines;
do IFS=""; match=`/bin/tail -n +$(($l-1)) greptext.txt | /bin/head -3`;
echo $match; echo "---";
done; IFS="$OIFS"
Это может иметь некоторый угловой случай, связанный с этим, и этосбрасывает IFS, когда, возможно, нет необходимости, хотя это подсказка для попытки использовать возможности оболочки и инструментов POSIX вместо интерпретатора высокого уровня для получения желаемого результата.
Мнение: Все хорошие операционные системы имеют: grep, awk, sed, tr, cut, head, tail, больше, меньше, vi как встроенные модули.На лучших операционных системах они находятся в /bin.