Рекурсивный grep для gz-файлов поиска строки из выходной строки - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь найти строку из вывода строки в рекурсивном поиске с папкой gz files.

Я использую команду, которая работает только:

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;

из найти строку внутри сжатого файла в папке

Как я могу сделать это так же, как при использовании обычного grep с pipe следующим образом?

cat <folder> | grep 'pattern1' | grep 'pattern2'

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Вы можете передать результаты поиска через второй grep:

find . -name "*.gz" -exec zgrep -H "PATTERN1" {} \; | grep "PATTERN2"

0 голосов
/ 15 января 2019

Под своим "псевдокодом" (cat | grep 'pattern2' | grep 'pattern3') вы имеете в виду?

Если у нас есть файл file.txt, который содержит:

pattern this text on the line <br>
pattern2 this text on the line <br>
this pattern3 <br>
pattern2pattern3 this line

тогда ваш "псевдокод"

cat file.txt | grep 'pattern2' | grep 'pattern3'

приведет к: pattern2pattern3 this line. Если это то, что вы хотите, мы могли бы использовать

zcat file.gz | grep 'pattern1' | grep 'pattern2'

Но , если мы посмотрим на find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;, это даже близко не к предмету Самта, потому что это было бы больше похоже на:

   cat /**.*txt | grep 'pattern'

что само по себе немного особенное, результат samt будет дан

grep -R 'pattern'

Тогда я бы сказал, что в случае .gz (не уверен, что /**/*.gz будет работать с zcat)

zcat /**/*.gz | grep 'pattern'
0 голосов
/ 15 января 2019

Относительно вашего конкретного вопроса

How can I make this happen just like using normal grep with pipe: cat | grep 'pattern1' | grep 'pattern2'

Вы можете использовать find до cat всех файлов, а затем grep, но это не будет хорошо, потому что вы получите только строки результата без имени файла.

Лучше всего использовать две команды grep:

zgrep 'pattern1' *.gz | grep 'pattern2'

Если вы хотите включить подкаталоги, вы можете использовать globstar (при условии, что вы работаете bash):

shopt -s globstar
zgrep 'pattern1' **.gz | grep 'pattern2'
...