Usando find com grep e passe o resultado para outro grep

Usando find com grep e passe o resultado para outro grep

Estou tentando usar find para localizar um arquivo e o primeiro grep procurará um padrão nesse arquivo. o resultado será passado para um segundo grep assim

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

Estou entendendo

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             

Estou procurando por

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

PS: Estou tentando não usar pipe | com encontrar

Responder1

Um grande obrigado a George Vasiliou, ambas as respostas funcionaram bem. A resposta 2 é minha escolha.

resposta 1

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

Resposta 2

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

Responder2

Você terá que alimentar o resultado do primeiro grepno segundo grep. O comando na sua pergunta faz ambas as chamadas grepindependentemente uma da outra.

Uma sugestão seria fazer

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

Isso encontraria seu CDRV.txtarquivo (se o arquivo passar nos testes -typee -mtime) e extrairia todas as linhas que contêm o substring Audience. Esse resultado seria passado para o segundo grepque extrairia as linhas que também contém a substring Prime_Time. Este segundo grepestá sendo executado independentemente do findcomando.

Obviamente, você poderia usar a string Audience,Prime_Timewith grepdiretamente ou, se a ordem dessas duas strings for incerta, usarawk como você sugere em sua própria resposta, o que lhe daria um pouco mais de flexibilidade.

Em uma máquina Linux comum rodando bash, você também pode passar sem 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

informação relacionada