Можно просто установить GNU grep или Ack (записанный в Perl, понимает многие опции grep's GNU и больше).
Если Вы предпочитаете придерживаться стандартных инструментов плюс немного сценариев, вот awk сценарий, который эмулирует поведение grep's GNU -A
и -B
опции. Минимально протестированный.
#!/bin/sh
# grep-ac: a grep-like awk script
# Arguments: pattern = awk regexp to search for
# before = number of lines to print before a match
# after = number of lines to print after a match
{ "exec" "awk" "-f" "$0" "$@"; }
# The array h contains the history of lines that haven't been printed
# but are eligible for being "before" lines.
# The variable until contains the number of the last "after" line to print.
match($0, pattern) { # the current line matches
for (i in h) {
print h[i]; # print each remaining before line
delete h[i]; # delete each line as it's printed
}
until=NR+after; # record the last after line to print
}
{
if (NR<=until) print $0; # from a match to its last after line: print
else h[NR]=$0; # after that: save in history
delete h[NR-before]; # remove line too old to be a before line
}
END {exit !until} # exit status: 0 if there was a match, else 1
Выполните его как grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
где PATTERN
шаблон должен искать (расширенное регулярное выражение с несколькими awk дополнениями), и NBEFORE
и NAFTER
числа строк для печати прежде и после соответствия соответственно (принимающий значение по умолчанию к 0). Пример:
TMOUT
набор переменной среды (ничто, чтобы сделать с screen
)? Если это будет установлено на 600, то колотите, то закроет сеанс после 600 секунд (10 минут).