![將 find 與 grep 結合使用並將結果傳遞給另一個 grep](https://rvso.com/image/169437/%E5%B0%87%20find%20%E8%88%87%20grep%20%E7%B5%90%E5%90%88%E4%BD%BF%E7%94%A8%E4%B8%A6%E5%B0%87%E7%B5%90%E6%9E%9C%E5%82%B3%E9%81%9E%E7%B5%A6%E5%8F%A6%E4%B8%80%E5%80%8B%20grep.png)
我嘗試使用 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