![grepでfindを使用し、その結果を別のgrepに渡す](https://rvso.com/image/169437/grep%E3%81%A7find%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%80%81%E3%81%9D%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E5%88%A5%E3%81%AEgrep%E3%81%AB%E6%B8%A1%E3%81%99.png)
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
。質問のコマンドは、両方grep
の呼び出しを互いに独立して実行します。
提案としては、
find /Dime/Lock_Room/ -type f -mtime -1 -name CDRV.txt \
-exec grep -F Audience {} \; | grep -F Prime_time
これにより、ファイルが (およびテストCDRV.txt
に合格した場合)検索され、サブ文字列 を含むすべての行が抽出されます。この結果は、サブ文字列 も含む行を抽出する2 番目のコマンドに渡されます。この 2 番目のコマンドは、コマンドとは独立して実行されます。-type
-mtime
Audience
grep
Prime_Time
grep
find
明らかに文字列を直接使用することもできますAudience,Prime_Time
がgrep
、これら2つの文字列の順序が不明な場合は、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