![Verwenden von „find“ mit „grep“ und Übergeben des Ergebnisses an ein anderes „grep“](https://rvso.com/image/169437/Verwenden%20von%20%E2%80%9Efind%E2%80%9C%20mit%20%E2%80%9Egrep%E2%80%9C%20und%20%C3%9Cbergeben%20des%20Ergebnisses%20an%20ein%20anderes%20%E2%80%9Egrep%E2%80%9C.png)
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 grep
in das zweite einspeisen grep
. Der Befehl in Ihrer Frage führt beide Aufrufe grep
unabhä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.txt
Datei finden (wenn die Datei die Tests -type
und 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 grep
läuft unabhängig vom find
Befehl.
Sie können natürlich die Zeichenfolge Audience,Prime_Time
mit grep
direkt 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 bash
kö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