Как правильно запустить поиск |параллельно с grep + escape-символами? - PullRequest
2 голосов
/ 01 октября 2019

У меня в папке примерно 1500 2 ГБ файлов, и я хотел бы извлечь из них строки на основе регулярного выражения. Я попытался:

find . -regex "filename pattern" -exec grep -P "pattern1\t|pattern2\t|pattern3\t|...|patternN\t" {} +

, который работает отлично, но довольно медленно. Затем я прочитал о запуске grep с GNU parallel, но не смог понять, как правильно его использовать. Вот что я попробовал:

find . -regex "filename pattern" | parallel grep -P "pattern1\t|pattern2\t|pattern3\t|...|patternN\t" {}

вместе с несколькими вариантами этой команды. Однако я получаю взамен:

/bin/bash: pattern1t: command not found
/bin/bash: pattern3t: command not found
/bin/bash: pattern2t: command not found
...

Кажется, проблема заключается в \t, который я использую, чтобы убедиться, что я сопоставляю всю строку в столбце файла TSV. Команда grep без параллели отлично работает с этим регулярным выражением.

Как можно использовать escape-символы в регулярном выражении grep с parallel?

1 Ответ

3 голосов
/ 01 октября 2019

Как заметил @Mark Setchell, я пропустил аргумент "--quote"! Это решение работает:

find . -regex "filename pattern" -print0 | parallel -0 --quote grep -P "pattern1\t|pattern2\t|pattern3\t|...|patternN\t"
...