두 개의 grep(포함 및 제외)과 awk [중복]을 사용하여 찾기

두 개의 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

하지만... 결과에는 때때로 files 및 AAA.. 만 포함됩니다.AAABBB

편집하다:

다음 질문과 거의 같습니다.하나의 문자열을 포함하지만 다른 문자열은 포함하지 않는 파일 찾기하지만 입증된 답변이 없으면 읽기가 정말 어렵습니다. 내 대답의 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

관련 정보