使用 find 和 grep 並將結果傳遞給另一個 grep
我正在嘗試使用 find 來定位文件,第一個 grep 將在該文件中查找模式。結果將像這樣傳遞給第二個 grep
find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec fgrep "Audience" {} \; -exec fgrep "Prime_Time" {} \;
我越來越
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
我在找
1584508620604,Audience,Prime_Time/45214_3514 1584508620604,Audience,Prime_Time/55096_4206
PS:我盡量不使用管道 | 找到
非常感謝 George Vasiliou,兩個答案都很好,答案 2 是我的選擇。
答案 1
find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec bash -c 'fgrep "Audience <(fgrep "Prime_Time" $0)' {} \;
答案 2
find /Dime/Lock_Room/ -name CDRV.txt -type f -mtime -1 -exec awk '/Audience/ && /Prime_Time/' {} \;
您必須將第一個的結果
grep
輸入第二個grep
。您問題中的命令都相互grep
獨立地呼叫。一個建議是做
find /Dime/Lock_Room/ -type f -mtime -1 -name CDRV.txt \ -exec grep -F Audience {} \; | grep -F Prime_time
這將找到您的
CDRV.txt
文件(如果文件通過了-type
和-mtime
測試)並提取包含 substring 的所有行Audience
。這個結果將被傳遞給第二個grep
,它將提取也包含 substring 的行Prime_Time
。這第二個grep
是獨立於find
命令執行的。您顯然可以直接使用字元串
Audience,Prime_Time
withgrep
,或者,如果這兩個字元串的順序不確定,awk
請按照您在自己的答案中的建議使用,這會給您更多的靈活性。在執行的普通 Linux 機器上
bash
,您也可以不用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