Использование find с grep и передача результата другому grep

Использование find с grep и передача результата другому grep

Я пытаюсь использовать find для поиска файла, и первый grep будет искать шаблон в этом файле. Результат будет передан второму grep, например так:

find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec fgrep "Audience" {} \; -exec fgrep "Prime_Time" {} \;

Я получаю

1584508620604,Audience,Lunchtime/14196_135
1584508620604,Audience,Early_afternoon/8824_188
1584508620604,Audience,Late_afternoon/20124_128
1584508620604,Audience,Prime_Time/45214_3514
1584508620604,Audience,Prime_Time/55096_4206
1584508620604,Audience,Graveyard/1800_256
1584508620604,Public,Prime_Time/148351_1251
1584508620604,Audience,Graveyard/1800_256
1584508620604,Public,Prime_Time/158521_19             

Я ищу

1584508620604,Audience,Prime_Time/45214_3514
1584508620604,Audience,Prime_Time/55096_4206

PS: Я стараюсь не использовать pipe | с find

решение1

Огромное спасибо Джорджу Василиу, оба ответа сработали отлично, мой выбор — ответ 2.

Ответ 1

find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec bash -c 'fgrep "Audience <(fgrep "Prime_Time" $0)' {} \;

Ответ 2

find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec awk '/Audience/ && /Prime_Time/' {} \;

решение2

Вам придется передать результат первого grepво второй grep. Команда в вашем вопросе выполняет оба вызова grepнезависимо друг от друга.

Предложение было бы сделать

find /Dime/Lock_Room/ -type f -mtime -1 -name CDRV.txt \
    -exec grep -F Audience {} \; | grep -F Prime_time

Это найдет ваш CDRV.txtфайл (если файл проходит тесты -typeи -mtime) и извлечет все строки, содержащие подстроку Audience. Этот результат будет передан второму grep, который извлечет строки, также содержащие подстроку Prime_Time. Этот второй grepвыполняется независимо от findкоманды.

Очевидно, вы можете использовать строку Audience,Prime_Timeнапрямую grepили, если порядок этих двух строк неизвестен, использоватьawk как вы предполагаете в своем собственном ответе, что даст вам немного больше гибкости.

На обычной машине с Linux, работающей под управлением Windows bash, вы также можете обойтись без find:

touch --date='now -1 day' timestamp
shopt -s globstar dotglob nullglob

for pathname in /Dime/Lock_Room/**/CDRV.txt; do
    if [[ ! -f $pathname ]] || [[ $pathname -ot timestamp ]]; then
        continue
    fi
    grep -F Audience "$pathname"
done | grep -F PrimeTime
rm -f timestamp

Связанный контент