![2つのgrep(含むと除く)とawk [冗長]を使用して検索](https://linux33.com/image/129103/2%E3%81%A4%E3%81%AEgrep%EF%BC%88%E5%90%AB%E3%82%80%E3%81%A8%E9%99%A4%E3%81%8F%EF%BC%89%E3%81%A8awk%20%5B%E5%86%97%E9%95%B7%5D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E6%A4%9C%E7%B4%A2.png)
AAA
ファイルには含まれていませんが、ファイルの内容を特定の抽出してファイルにすべてのパスファイルを保存したいと思いますBBB
。
私はたくさん試しましたが、これは私の目標に近いです。
find /data/my_project -type f -name "*.php" -exec grep -q "AAA" {} \; -exec grep -L "BBB" {} \; -exec awk '/AAA/{print $NF}'> /tmp/tables_names.txt {} \; -print > /tmp/class_list.txt
しかし...結果には時々ファイルとAAA
..だけが含まれます。AAA
BBB
編集する:
次の質問とほぼ同じです。1つの文字列を含むが他の文字列は含まないファイルを見つけるしかし、証明された答えがなければ、読むのは本当に難しいです。私の答えの75%は本当に申し訳ありません...しかし、一致するファイルパスだけでなく、一致するファイルの抜粋(テキストの一部)も返したいです!
答え1
*.php
ファイル名が含まれているが含まれていないファイル名と一致するすべての一般ファイルを見つけ、/data/my_project
そのパス名を次の場所に保存します。AAA
BBB
/tmp/class_list.txt
find /data/my_project -type f -name '*.php' \
-exec grep -qF 'AAA' {} ';' \
! -exec grep -qF 'BBB' {} ';' \
-print >/tmp/class_list.txt
答え2
find
+awk
解決策:
find /data/my_project -type f -name "*.php" -exec \
awk '/AAA/{ a=1 }/BBB/{ b=1 }END{ exit (!a || (a && b)) }' {} \; -print > /tmp/class_list.txt
答え3
この試み:
find /data/my_project -type f -name '*.php' -exec \
bash -c 'grep -q AAA "$1" && ! grep -q BBB "$1" && echo "$1"' -- {} \; \
> /tmp/class_list.txt
答え4
find .... -name '*.php' \
-exec awk -v RS="\0" '/AAA/ && !/BBB/{print FILENAME}' {} \; > out