exec에 여러 grep 명령을 추가해 보세요

exec에 여러 grep 명령을 추가해 보세요

디렉터리(및 모든 하위 디렉터리)의 모든 파일에서 문자열을 검색하려고 합니다. 파일에 해당 문자열이 있으면 다른 문자열(이 경우에는 "snake")이 나타나는 횟수를 검색하여 출력하고 싶습니다. 또한 "뱀"이 나타나는 파일의 행을 출력하고 싶습니다.

echo "Files with Reptile:"
find . -type f -name "*.txt" -exec grep -l "Reptile" {} \;

내 과제는 중괄호 뒤에 추가 grep 명령을 추가하는 방법입니다. 몇 가지를 시도했지만 "-exec 누락된 인수" 오류가 계속 발생합니다.

내가 이 발견에 너무 많은 것을 집어넣으려고 하는 걸까?

감사해요

답변1

다음을 시도해 볼 수 있습니다.

$ find . -type f -name "*.txt" -exec sh -c "grep -l "Reptile" {} | xargs -I% grep -Hn snake %" \;
./rep1.txt:2:snake
./rep2.txt:5:another snake

출력에는 콜론으로 구분된 목록이 포함됩니다. 여기서 첫 번째 인수는 파일 이름(인수에서 -H까지 grep)이고, 두 번째 인수는 원하는 용어가 나타나는 행 번호(인수에서 -n까지 grep)이며, 세 번째 인수는 행 자체입니다.

xargs외부로 이동할 수 있어 find다음을 제공합니다.

$ find . -type f -name "*.txt" -exec grep -l "Reptile" {} \; | xargs -i grep -Hn snake {}

(동일) -i매개변수는 더 이상 사용되지 않지만 편의상 자주 사용됩니다.xargs-I{}

입력 파일:

$ tail -n+1 rep*.txt
==> rep1.txt <==
Reptile
snake
iguana
crocodile

==> rep2.txt <==
Reptile
alligator
turtle
another snake
komodo dragon

==> rep3.txt <==
Reptile
lizard
gecko

잘못된 파일 이름을 처리해야 하는 경우 xargs를 병합 print0하고 -0선택하는 것을 고려할 수 있습니다.

답변2

여러 -exec조건자. 명령이 성공하는 경우에만 해당 되므로 -exec첫 번째 명령에 대해 특별한 작업을 수행할 필요가 없습니다 grep.

find ... -exec grep -q "Reptile" {} \; -exec grep -Hn snake {} \;

답변3

find . -type f -name "*.txt" -exec sh -c 't=$(mktemp)
        for fi
        do
                if grep -q Reptile "$fi"
                then
                        echo "$fi contains Reptile"
                        grep snake "$fi" | tee "$t"
                        echo "snake appeared on $(wc -l < "$t") line(s)"
                fi
        done
        rm -f "$t"
        ' sh {} +

이는 "snake"라는 단어가 포함되어 있지 않더라도 단어/문자열 "Reptile"을 포함하는 파일 이름을 보고하고 "snake"를 포함하는 줄 수를 독립적으로 보고합니다.

이런, 질문을 잘못 읽었고 필수 사항인 줄 알았습니다. 꺼내는 것은 쉽습니다.

find . -type f -exec sh -c '
        for fi
        do
                if grep -q Reptile "$fi"
                then
                        echo "$fi contains Reptile"
                        grep snake "$fi"
                fi
        done
        ' sh {} +

필요한 경우 -n옵션 을 추가할 수 있습니다.grep snake

이는 거의 모든 유효한 파일 이름을 처리해야 합니다. 공백으로 시작하거나 개행 문자를 포함하는 파일 이름에 대한 다른 답변을 확인하세요.

관련 정보