
findを使用してファイルを見つけようとしますが、最初のgrepはファイル内のパターンを見つけます。結果は、次のように2番目の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:findにパイプを使わないようにしました。
答え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
最初の結果を2番目の結果として供給する必要がありますgrep
。あなたの質問のコマンドはそれぞれ2つのgrep
独立した呼び出しを行います。
1つの提案は次のとおりです。
find /Dime/Lock_Room/ -type f -mtime -1 -name CDRV.txt \
-exec grep -F Audience {} \; | grep -F Prime_time
これにより、CDRV.txt
ファイルが検索され(ファイルが通過して-type
テスト-mtime
されている場合)、部分文字列を含むすべての行が抽出されますAudience
。結果は2番目の結果として渡され、部分grep
文字列も含む行を抽出しますPrime_Time
。 2番目は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