
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" ]]
("OR 변수 $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