使用两个 grep(包含和不包含)和一个 awk 查找

使用两个 grep(包含和不包含)和一个 awk 查找

我想将所有路径文件存储在文件中,其中包含文件内容的特定提取,其中 file containsAAA但 NOT 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

但是...结果包含有时仅包含文件AAAAAA并且BBB..

编辑 :

这与以下问题几乎相同查找包含一个字符串且不包含另一个字符串的文件但如果没有经过验证的答案,那就真的很难阅读。我的答案的 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

相关内容