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