반복되는 grep 명령을 별도의 파일로 리디렉션

반복되는 grep 명령을 별도의 파일로 리디렉션

grep을 사용하여 파일에 나열된 패턴을 사용하여 디렉터리를 재귀적으로 검색한 다음 나중에 참조할 수 있도록 각 결과를 자체 파일에 저장하고 싶습니다.

나는 (사용하여이 문제지침으로) 다음을 제안합니다.

#!/bin/bash

mkdir -p grep_results   # For storing results

echo "Performing grep searches.."
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Seaching for $line.."
    grep -r "$line" --exclude-dir=grep_results . > ./grep_results/"$line"_infile.txt
done

echo "Done."

그러나 실행하면 CTRL-C를 누를 때까지 콘솔이 정지됩니다.

$ bash grep_search.sh search_terms.txt
Performing grep searches..

이 스크립트의 문제점은 무엇입니까? 아니면 내가 잘못하고 있는 걸까?

답변1

여기에는 몇 가지 질문이 있습니다.

  1. 루프는 while입력을 읽지 않습니다. 올바른 형식은 다음과 같습니다.

    while read line; do ... ; done < input file
    

    또는

    some other command | while read ...
    

    따라서 루프가 정지되어 입력을 기다립니다. 스크립트를 실행한 다음 아무 것도 입력하고 Enter 키를 눌러 이를 테스트할 수 있습니다(여기에서는 입력했습니다 foo).

    $ foo.sh 
    Performing grep searches..
    foo
    Searching for foo..
    

    다음에 힌트를 추가하여 이를 개선할 수 있습니다 read.

    while IFS='' read -p "Enter a search pattern: " -r line ...
    

    Ctrl그러나 + 를 사용하여 중지할 때까지 계속 실행됩니다 C.

  2. (즉 || [[ -n "$line" ]], "또는 $line 변수가 비어 있지 않음"을 의미함)은 절대 실행되지 않습니다. 중단 으로 인해 read"OR"이 도착하지 않습니다 . 어쨌든, 나는 당신이 무엇을 원하는지 이해하지 못합니다. 정의되어 $line있으면 검색 하고 정의되지 않으면 사용하려면 다음과 같은 것이 필요합니다.$lineread

    if [[ -n "$line" ]]; then
         grep -r "$line" --exclude-dir=grep_results > ./grep_results/"$line"_infile.txt
    else
        while IFS='' read -p "Enter a search pattern: " -r line || [[ -n "$line" ]]; do
          grep -r "$line" --exclude-dir=grep_results > ./grep_results/"$line"_infile.txt
        done
    fi
    

    여기서 $line정의되지 않은 경우에도 수동으로 입력해야 합니다. 더 깔끔한 방법은 파일을 루프에 공급하는 것입니다 while.

    while IFS='' read -r line || [[ -n "$line" ]]; do
      grep -r "$line" --exclude-dir=grep_results > ./grep_results/"$line"_infile.txt
    done < list_of_patterns.txt
    

관련 정보