Проблемы с передачей вывода sed в grep через xargs - PullRequest
0 голосов
/ 03 апреля 2019

У меня проблемы с передачей на выход sed для использования с grep до xargs.Я думаю, что это проблема расширения переменных, но я не уверен.

Сценарий таков.В текущем каталоге есть эти файлы:

file1.log
file1.log.67654
file2.log
file2.log.66876
file3.log
file3.log.56768
...

Из этих файлов только некоторые из тех, которые заканчиваются на .log, содержат определенную строку, так что:

$ grep -l "certainString"
file1.log
file3.log

То, что я хочу, этонайдите, сколько из этих файлов ИЛИ те, которые начинаются таким образом, но имеют дополнительное расширение .numbers (файлы file1.log, file1.log.67654, file3.log и file3.log.56768 в этом примере) содержат другую строку.

Я думал, что эта команда сделает это:

grep -l "certainString" | sed "s/log/log*/g" | xargs grep -l "anotherString"

Но после замены log на log* на sed, xargs не расширяет *, но интерпретирует его буквальнопоэтому:

$ grep -l "certainString" | sed "s/log/log*/g" | xargs grep -l "anotherString"
grep: ./file1.log*: No such file or directory
grep: ./file3.log*: No such file or directory

Я читал об этом, и люди предлагают использовать что-то вроде:

grep -l "certainString" | sed "s/log/log*/g" | xargs -I@ sh -c 'grep -l "anotherString"'

Но я не могу заставить это работать (я не до конца понимаю, чтобыбудь честным).Я чувствую, что я просто там, но мне не хватает деталей.Любая помощь?

1 Ответ

0 голосов
/ 03 апреля 2019

в случае, если имена файлов не содержат пробелов или метасимвола сгущения (* [ ])

Просто добавьте @, потому что -I@ означает, что @ - это токен, который должен быть заменен аргументом

grep -l "certainString" | sed "s/log/log*/g" | xargs -I@ sh -c 'grep -l "anotherString" @'
...