Verwenden von „find“ mit „grep“ und Übergeben des Ergebnisses an ein anderes „grep“

Verwenden von „find“ mit „grep“ und Übergeben des Ergebnisses an ein anderes „grep“

Ich versuche, mit find eine Datei zu finden, und das erste grep sucht in dieser Datei nach einem Muster. Das Ergebnis wird wie folgt an ein zweites grep übergeben

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

Ich erhalte

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             

Ich suche

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

PS: Ich versuche, Pipe | nicht mit Find zu verwenden.

Antwort1

Ein großes Dankeschön an George Vasiliou, beide Antworten haben gut funktioniert, Antwort 2 ist meine Wahl.

Antwort 1

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

Antwort 2

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

Antwort2

Sie müssen das Ergebnis des ersten grepin das zweite einspeisen grep. Der Befehl in Ihrer Frage führt beide Aufrufe grepunabhängig voneinander aus.

Ein Vorschlag wäre,

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

Dies würde Ihre CDRV.txtDatei finden (wenn die Datei die Tests -typeund besteht -mtime) und alle Zeilen extrahieren, die die Teilzeichenfolge enthalten Audience. Dieses Ergebnis würde an den zweiten Befehl weitergegeben grep, der die Zeilen extrahieren würde, die ebenfalls die Teilzeichenfolge enthalten Prime_Time. Dieser zweite Befehl grepläuft unabhängig vom findBefehl.

Sie können natürlich die Zeichenfolge Audience,Prime_Timemit grepdirekt verwenden, oder, wenn die Reihenfolge dieser beiden Zeichenfolgen unsicher ist, verwenden Sieawk wie Sie in Ihrer eigenen Antwort vorschlagen, was Ihnen etwas mehr Flexibilität geben würde.

Auf einem normalen Linux-Rechner mit bashkönnten Sie auch ohne auskommen 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

verwandte Informationen