LINUX.ORG.RU
решено ФорумAdmin

grep поиск до определенного слова

 , , ,


1

1

может ли grep искать до определённого слова и останавливать поиск после этого? смысл в том, что есть сотни тысяч текстовых файлов у которых в самом начале есть искомая информация. у всех файлов есть одно и то же ключевое слово, после которого поиск в файле должен остановиться и продолжиться уже в следующем файле.

Ответ на: комментарий от man8531

Это две разные задачи (которые можно последовательно соединить через пайп): обрезать и искать в «обрезке». Обрезать можно, например, sed'ом, в обрезке искать grep'ом. Или даже можно всё в sed сделать. Можно в awk, можно в perl. В общем, задачу одним grep'ом не решить, потому что задача составная.

anonymous ()
Ответ на: комментарий от anonymous

а есть желающий написать пример на perl? кратко: найти в каталоге «каталог» все файлы с искомым словом «вася» и искать только до ключевого слова «ключевое», а все найденные файлы скопировать из «каталог» в папку «найденные»

man8531 ()

если не попадутся умельцы в perl, то подскажите как перенаправить вывод данных скрипта awk на cp?

find /home/man8531/txt/test/ -iname "*.txt" -print0 | xargs -0 awk -f sear.awk

содержимое sear.awk

/вася/ { print FILENAME }
/ключевоеслово/ { nextfile }
на дисплей выводит список, а вот как завернуть на копирование в указанный каталог - вопрос. такая комбинация не проходит
find /home/man8531/txt/test/ -iname "*.txt" -print0 | xargs -0 awk -f sear.awk | xargs cp -t /home/man8531/txt/search/

man8531 ()
Ответ на: комментарий от anonymous
find /home/man8531/txt/test/ -iname "*.txt" -print0 | xargs -0 awk -f sear.awk | xargs -d '\n' cp -t /home/man8531/txt/search/

всё верно, загвоздка была, в итоге, в переводе строки. спасибо всем откликнувшимся! awk оказалось достаточно по скорости обработки: 250гб текста отрабатывает минут за 10. страшно подумать с какой скоростью отработает perl...

man8531 ()
Ответ на: комментарий от legolegs

а нельзя обойтись без файла-скрипта .awk? т.е. искомое слово и ключевоеслово сразу набирались в строке bash что-то вроде этого:

find /home/man8531/txt/test/ -iname "*.txt" -print0 | xargs -0 awk /вася/ { printf ("%s\0", FILENAME);nextfile; } & /ключевоеслово/ { nextfile; } | xargs -0 cp -t /home/man8531/txt/search/

man8531 ()