將 find 與 grep 結合使用並將結果傳遞給另一個 grep

將 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:我試著不使用管道 |與查找

答案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_Timegrep或者,如果這兩個字串的順序不確定,請使用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

相關內容