grep -A 2 -B 3
печатает 2 строки после строки grep и печатает 3 строки раньше.
grep -C 3
печатает 3 строки до и 3 строки после
К сожалению, grep
я использую не поддерживает эти параметры. Существуют ли альтернативные команды или сценарии для имитации этого? Используете sed
/ awk
/ perl
/ shell-скрипты?
text-processing
grep
awk
perl
Прашант Бхате
источник
источник
-C
переключатель.GNU > /usr/local
. Программы GNU имеют множество очень полезных расширений и предназначены для избежания произвольных ограничений (но вы платите дорого за размер, а иногда и за производительность). Многие пропиетарные системы имеют «неофициальные» репозитории пакетов с GNU и другими инструментами. «Партнер» не скажет вам о них, даже когда ими управляет продавец ...Ответы:
Один умеренно уродливый способ сделать это
или заменить
-c
на-C NUM
дляNUM
строк контекста. Это произведет дополнительный выход, все же. (Если вашаdiff
поддержка-u
/-U NUM
, это будет чище.)Если у вас
diff
нет-c
/-C
/-u
, есть еще способы сделать это, но они довольно уродливы. С другой стороны, система,diff
которая даже не поддерживает,-c
вероятно, также не имеет Perl.источник
grep -v pattern file | diff -c - file
извед требуется только Perl, и включает в себя
-A
,-B
и-C
варианты , что работа , как Grep - х. Он использует синтаксис регулярных выражений Perl вместо grep, и способ выбора файлов для поиска совершенно другой. Возможно, вы захотите попробовать эту-f
опцию при ее использовании (которая распечатывает файлы, которые она будет искать, фактически ничего не ища).Он может быть установлен как один скрипт, который не требует неосновных модулей. Просто поместите его в свой
~/bin
каталог (или где-нибудь еще в вашем PATH, к которому у вас есть права на запись) и убедитесь, что онchmod
исполняемый.источник
ack
для собственного использования.Этот простой скрипт на Perl
grep -A
до некоторой степени эмулируетОбратите внимание, что вы можете добавить оператор использования, чтобы сделать сценарий читабельным и удобным для использования;)
источник
grep-A 3 foo
выглядит гораздо естественнее, чемgrep-A foo 3
. :-)Вы можете просто установить GNU grep или Ack (написано на Perl, понимает многие параметры GNU grep и многое другое).
Если вы предпочитаете использовать стандартные инструменты и немного сценариев, вот скрипт awk, который имитирует поведение GNU grep
-A
и его-B
параметров. Минимально проверено.Запустите его, указав,
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
гдеPATTERN
находится шаблон для поиска ( расширенное регулярное выражение с несколькими дополнениями в awk ),NBEFORE
иNAFTER
количество строк, которые нужно напечатать до и после совпадения соответственно (по умолчанию 0). Пример:источник
{ "exec" "awk" "-f" "$0" "$@"; }
: очень изящный способ обойти ограничения в разборе строки shebang.Оказывается, довольно сложно эмулировать -B из-за проблем, которые возникают, когда у вас совпадают строки, следующие друг за другом напрямую. Это в значительной степени запрещает использование любого вида сквозного сканирования файлов.
Я понял это, играя со следующим приближением:
Это будет работать примерно так же, как и grep -A7 -B3, с оговоркой, описанной в первом абзаце.
Альтернативное (также однофайловое) решение этой проблемы заключается в использовании perl для подачи sed командной строки:
источник
shift @A if push(@A,$_)>7;
Бит только сохраняет массив максимального размера 7 вокруг. (это ваш параметр -A). Второй вариант хранит невероятно маленький файл (просто запустите perl без внешнего слоя sed, чтобы увидеть, что там сгенерировано), но он читает файл дважды.Используя,
sed
вы можете сначала получить номера строк совпадающих строк, уменьшить и увеличить заданный номер строки вwhile
цикле, а затем использоватьsed -n "n1,n2p"
для печати строк контекста lead (n1
) и trailing (n2
) (аналогичноsed
альтернативе, предложенной пользователем 455). Однако многие процессы чтения могут привести к снижению производительности.ed
может напрямую ссылаться на предыдущую и последующую строки совпавшей строки, но завершается неудачно, если указанный диапазон строк не существует; например, совпадающая строка - это строка № 2, но должны быть напечатаны 5 строк перед совпадением. Используяed
его , поэтому необходимо добавить соответствующее количество (пустых) строк в начале и в конце. (Однако, для больших файловed
может не подойти , см .: bfs - сканер больших файлов ).источник