Usar find con grep y pasar el resultado a otro grep

Usar find con grep y pasar el resultado a otro grep

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 grepen el segundo grep. El comando en su pregunta realiza ambas llamadas grepde 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.txtarchivo (si el archivo pasa las pruebas -typey -mtime) y extraería todas las líneas que contienen la subcadena Audience. Este resultado se pasaría al segundo grepque extraería las líneas que también contienen la subcadena Prime_Time. Este segundo grepse ejecuta independientemente del findcomando.

Obviamente, podría usar la cadena Audience,Prime_Timedirectamente grepo, 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

información relacionada