Команда Grep "-C" на всей машине

Я использую grep -C 1 "matching string" "xty.pom"

Это работает на машинах Linux, но тот же код не работает на других платформах, таких как AIX, SunOS_x64, HPUX.

Есть ли альтернатива этому, чтобы одна и та же логика кода работала на всех платформах?

1 ответ

Решение

Это будет работать как grep -C 1 "matching string" но должен работать на платформах, которые не поддерживают grep -C опция:

awk '/matching string/{print last; f=2} f{print; f--} {last=$0}' File

Как это устроено

  • /matching string/{print last; f=2}

    Если текущая строка соответствует регулярному выражению matching stringзатем распечатайте предыдущую строку (которая была сохранена в last) и установить f до 2.

  • f{print; f--}

    Если f отличен от нуля, затем вывести текущую строку и уменьшить f,

  • last=$0

    Задавать last равно содержанию текущей строки.

улучшение

С некоторыми незначительными изменениями мы можем лучше обрабатывать перекрывающиеся совпадения:

awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=$0}'

Как пример вывода с перекрывающимся совпадением:

$ printf '%s\n'   a a b |  awk '/a/{if (NR>1 && !f)print last; f=3} f>1{print} f{f--} {last=$0}'
a
a
b

ВС /Solaris

Родной awk на Sun/Solaris, как известно, заполнен ошибками. Используйте вместо nawk или еще лучше /usr/xpg4/bin/awk или же /usr/xpg6/bin/awk

Другие вопросы по тегам