![Использование find с grep и передача результата другому grep](https://rvso.com/image/169437/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20find%20%D1%81%20grep%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%20%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%BC%D1%83%20grep.png)
Я пытаюсь использовать 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