Linux

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

  • March 21, 2020

我正在嘗試使用 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_Timewith 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

引用自:https://unix.stackexchange.com/questions/573641