2つのgrep(含むと除く)とawk [冗長]を使用して検索

2つのgrep(含むと除く)とawk [冗長]を使用して検索

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..だけが含まれます。AAABBB

編集する:

次の質問とほぼ同じです。1つの文字列を含むが他の文字列は含まないファイルを見つけるしかし、証明された答えがなければ、読むのは本当に難しいです。私の答えの75%は本当に申し訳ありません...しかし、一致するファイルパスだけでなく、一致するファイルの抜粋(テキストの一部)も返したいです!

答え1

*.phpファイル名が含まれているが含まれていないファイル名と一致するすべての一般ファイルを見つけ、/data/my_projectそのパス名を次の場所に保存します。AAABBB/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

関連情報