Я знаю, что с помощью grep я могу использовать поля -A
и -B
извлекать предыдущую и следующую строки из совпадения.
Тем не менее, они вытягивают все строки между совпадениями, основываясь на том, сколько строк указано.
grep -r -i -B 5 -A 5 "match"
Я хотел бы получить только 5- ю строку перед матчем и 5- ю строку после матча в дополнение к совпадающей строке, а не получить линии между ними.
Есть ли способ сделать это с grep
?
command-line
grep
awk
chollida
источник
источник
grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'
Ответы:
Инструмент, который вы хотите использовать, называется sift. Это в основном grep на стероидах. Grep параллельно. У Sift есть огромное количество опций для того, чтобы делать именно то, что вы хотите - в частности, возвращать определенную строку относительно соответствия (ей), за которым может / не может следовать / предшествовать какой-либо текст.
Меня удивляет, что sift не является основным gnu, как он написан на языке go, но отлично устанавливается на Linux. ИТ выполняет параллельный поиск, используя весь объем огромного количества текста, где grep требуется всего несколько недель, чтобы сделать то же самое.
Сайт просеивания - см. Примеры
источник
Если:
Потом:
источник
/match/ {matched[NR]}
? Я никогда не видел массив или переменную как целую команду. Помещает ли это номер текущей записи каждой совпавшей строки в массив.key in array
. Я запоминаю номера строк, где появляется шаблонЭто в основном решение Гленна, но реализовано с помощью Bash, Grep и sed.
Обратите внимание, что номера строк меньше 1 приведут к ошибке sed, а номера строк, превышающие количество строк в файле, не приведут к выводу ничего.
Это просто минимум. Чтобы заставить его работать рекурсивно и обрабатывать описанные выше случаи с номерами строк, потребуется некоторое время.
источник
Это не может быть сделано только с
grep
. Еслиed
вариант:Сценарий в основном говорит: для каждого соответствия / match / выведите строку 5 строк до этого, затем 5 строк после этого, затем 5 строк после этого.
источник
ed
это всегда ответ, потому чтоed
это стандартный текстовый редактор.grep
ответ, ответ «Вы не можете сделать это с помощью X, но вы можете сделать это с помощью Y, вот как» все еще является верным ответом, поскольку вы не только отвечаете на вопрос OP, но и предоставляете альтернативу это будет работать. Это правильный тип ответа здесь.Здесь мы используем AWK «s функцию для вызова внешней команды для печати линии , которые AWK совпавшие с рисунком с 5 - й линии до и после матча.
system(command)
sed
match
Синтаксис прост, вам просто нужно поместить внешнюю команду внутри двойной кавычки, а также ее переключатели и экранировать то, что вы хотите точно передать команде, все остальное, относящееся к параметрам
awk
самой себя, должно быть вне кавычек. Итак, нижеприведенный сед :перевести на:
NR
это номер строки, который соответствует шаблонуmatch
иFILENAME
является текущим именем файла обработки, проходящим мимоawk
.источник
используя пример текстового файла @ glenn и используя perl вместо awk:
даст те же результаты, но работает быстрее:
источник