
我嘗試使用 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:我試著不使用管道 |與查找
答案1
非常感謝 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/' {} \;
答案2
您必須將第一個的結果輸入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
測試)並提取包含子字串 的所有行Audience
。該結果將傳遞給第二個,第二個grep
將提取也包含子字串的行Prime_Time
。第二個grep
獨立於命令運作find
。
顯然,您可以直接使用該字串Audience,Prime_Time
,grep
或者,如果這兩個字串的順序不確定,請使用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