![Usando find com grep e passe o resultado para outro grep](https://rvso.com/image/169437/Usando%20find%20com%20grep%20e%20passe%20o%20resultado%20para%20outro%20grep.png)
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 grep
no segundo grep
. O comando na sua pergunta faz ambas as chamadas grep
independentemente 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.txt
arquivo (se o arquivo passar nos testes -type
e -mtime
) e extrairia todas as linhas que contêm o substring Audience
. Esse resultado seria passado para o segundo grep
que extrairia as linhas que também contém a substring Prime_Time
. Este segundo grep
está sendo executado independentemente do find
comando.
Obviamente, você poderia usar a string Audience,Prime_Time
with grep
diretamente 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