将 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

相关内容