Estoy intentando usar buscar para localizar un archivo y el primer grep buscará un patrón en ese archivo. el resultado se pasará a un segundo grep así
find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec fgrep "Audience" {} \; -exec fgrep "Prime_Time" {} \;
Me estoy poniendo
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
Estoy buscando
1584508620604,Audience,Prime_Time/45214_3514
1584508620604,Audience,Prime_Time/55096_4206
PD: Estoy intentando no utilizar pipe | con encontrar
Respuesta1
Muchas gracias a George Vasiliou, ambas respuestas funcionaron bien, la respuesta 2 es mi elección.
respuesta 1
find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec bash -c 'fgrep "Audience <(fgrep "Prime_Time" $0)' {} \;
Respuesta 2
find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec awk '/Audience/ && /Prime_Time/' {} \;
Respuesta2
Tendrás que introducir el resultado del primero grep
en el segundo grep
. El comando en su pregunta realiza ambas llamadas grep
de forma independiente.
Una sugerencia sería hacer
find /Dime/Lock_Room/ -type f -mtime -1 -name CDRV.txt \
-exec grep -F Audience {} \; | grep -F Prime_time
Esto encontraría su CDRV.txt
archivo (si el archivo pasa las pruebas -type
y -mtime
) y extraería todas las líneas que contienen la subcadena Audience
. Este resultado se pasaría al segundo grep
que extraería las líneas que también contienen la subcadena Prime_Time
. Este segundo grep
se ejecuta independientemente del find
comando.
Obviamente, podría usar la cadena Audience,Prime_Time
directamente grep
o, si el orden de estas dos cadenas es incierto, usarawk
como sugieres en tu propia respuesta, lo que le daría un poco más de flexibilidad.
En una máquina Linux común y corriente bash
, también puede arreglárselas sin 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