![두 개의 grep(포함 및 제외)과 awk [중복]을 사용하여 찾기](https://linux55.com/image/129103/%EB%91%90%20%EA%B0%9C%EC%9D%98%20grep(%ED%8F%AC%ED%95%A8%20%EB%B0%8F%20%EC%A0%9C%EC%99%B8)%EA%B3%BC%20awk%20%5B%EC%A4%91%EB%B3%B5%5D%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%B0%BE%EA%B8%B0.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
하지만... 결과에는 때때로 files 및 AAA
.. 만 포함됩니다.AAA
BBB
편집하다:
다음 질문과 거의 같습니다.하나의 문자열을 포함하지만 다른 문자열은 포함하지 않는 파일 찾기하지만 입증된 답변이 없으면 읽기가 정말 어렵습니다. 내 대답의 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