find 및 grep을 사용하여 문자열 목록을 검색하는 방법

find 및 grep을 사용하여 문자열 목록을 검색하는 방법

bash 스크립트에 다음을 작성하려고 합니다.

#!/bin/bash

find /path/to/file -type f -name "*.html" -exec grep -l "XXXX" '{}' \; -print

여기서 XXXX는 이 명령이 반복되어야 하는 문자열 목록입니다. 나는 스크립트의 올바른 부분을 루프에 넣는 데 어려움을 겪었고 후속 루프를 위해 XXXX를 변수에 저장하는 데 어려움을 겪었습니다.

답변1

zsh태그를 사용했지만 #!/bin/bashshebang을 사용했습니다. 두 개의 다른 껍질이 있습니다 bash.zsh

grep여러 문자열을 찾는 한 가지 방법은 를 사용하여 호출하는 것입니다 grep -F -e 'first string' -e 'second string' -e'blah'....

zsh에서 배열에 문자열 목록이 있는 경우:

strings=('first string' 'second string' '***')

넌 할 수있어:

GNU 사용 grep:

grep -Frl --include='*.html' -e$^strings .

또는 다음을 사용하십시오 find.

find . -name '*.html' -type f -exec grep -Fl -e$^strings {} +

또는 zsh재귀적 globbing과 glob 한정자를 사용합니다.

grep -Fl -e$^strings -- **/*.html(D.)

또는 인수 수에 대한 시스템 제한을 해결하려면 html 파일이 많은 경우 find's 와 같은 명령을 전달할 수 있습니다.-exec

autoload -Uz zargs
zargs -- **/*.html(D.) -- grep -Fl -e$^strings --

이는 파일 목록을 정렬할 수 있다는 장점도 있습니다( ot rder oN에 glob 한정자를 추가하여 이 정렬을 비활성화할 수 있음 ).No

-l이미 인쇄된(나열된) 파일 이름에는 일치하는 add 가 하나 이상 포함되어 있으므로 성공 -print시 인쇄된 파일 이름은 grep중복되며 파일 이름이 두 번 인쇄된다는 의미입니다.

답변2

해당 디렉토리의 모든 .html 파일에서 XXXX로 표시되는 문자열을 찾고 문자열이 발생하는 파일을 반환 하려면 grep다음으로 충분합니다.

egrep -l "string1|string2|string3" /path/to/directory/*.html 

grep -El "string1|string2|string3" /path/to/directory/*.html

둘 다 동일한 작업을 수행하지만 egrep대신 을 사용합니다 grep -E. 이 -l스위치는 문자열이 포함된 줄이 아닌 문자열이 나타나는 파일을 반환합니다. 문자열을 변수에 할당해야 하는 경우:

export strings='string1|string2|string3'

egrep -l "$strings" /path/to/directory/*.html 

grep -El "strings" /path/to/directory/*.html

답변3

찾으려는 문자열이 포함된 파일을 사용할 수 있습니다.

파일.txt

foo
bar

그런 다음

find /path/to/file -type f -name "*.html" -exec grep -l -f file.txt '{}' \; -print

답변4

문자열을 사용할 수 있는 파일에 대해 작업을 수행하려면 다음 명령을 사용하십시오.

#!/bin/bash

declare -a STRINGS=$(find /var/www/html/ -type f -name "*.html" -exec grep "this is 
test" {} \; -print)

for string in "${STRINGS[@]}"
do
   echo "${string}"
    echo "${STRINGS}"

done

산출:

[root@awx html]# sh test.sh
this is test file1
/var/www/html/1.html
this is test file2
/var/www/html/2.html
this is test file1
/var/www/html/1.html
this is test file2
/var/www/html/2.html
[root@awx html]#

관련 정보