Я хочу напечатать 5 строк контекста вокруг каждой строки, которая соответствует "foo", но не "foobar".

Я могу сделать матч достаточно легко с помощью <output> | awk '/foo/ && !/foobar/' но я не могу понять, как показать контекст как <output> | grep -C 5 'foo' подойдет.

Я бы согласился выяснить вышеупомянутое составное условие в однострочнике grep .

1 ответ1

0

Я получил это из ответа, который я дал на похожий вопрос, который я больше не могу найти:

awk -v context=5 '
BEGIN{ held = -1 }
{ for(i = context;i>0;i--)lb[i] = lb[i-1];
  lb[0] = sprintf("%s:%d:%s",FILENAME,NR,$0);
  held++;
}
/foo/ && !/foobar/{
 if(held>context)held = context;
 for(i = held;i>0;i--)print lb[i]
 held = -1;
 max = NR+context
}
{ if(NR<=max){ print lb[0]; held = -1 }
  else{ if(held==context)print "--" }
}
'

Если ваш grep gnu и выполняет регулярные выражения perl pcre , вы можете сделать:

grep -P '(?!foobar)foo'

что означает смотреть вперед и не соответствовать foobar, а затем foo.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .