나는 사용자가 입력한 단어가 파일에 몇 번 나타나는지 사용자에게 알려주고 싶은 프로그램을 가지고 있습니다. 지금까지 쓴 내용이지만 작동하지 않습니다.
#! /bin/bash
echo "Enter the file that is to be searched (~/test/new)"
read location
echo "Enter the search term"
read search
$result = (grep -w "$search" $location | wc -w)
echo "The search term" $search "appears "$result" time/s in "$location
작동하게 하려면 어떻게 해야 하나요?
답변1
내가 올바르게 이해했다면 원하는 핵심 명령은 검색된 단어가 나타날 때마다 계산해야 합니다. GNU grep을 가정하면:
<"$file" grep -Fwo -- "$word" | wc -l
-F
비정규식, 축어적 문자열 일치로 전환하는 옵션입니다 . -w
귀하의 질문에서와 같이 단어 검색을 수행하고 -o
각 일치 항목을 한 줄에 개별적으로 인쇄하면 올바른 개수가 표시됩니다
wc -l
.
이제 프롬프트와 관련하여 bash를 활용할 수 있는 옵션이 read
있습니다 .-p
read -p 'Filename: ' file
read -p 'Word: ' word
할당은 var=value
달러 기호나 등호 주위에 공백 없이 형식을 취합니다.
count=$(grep-command)
마지막으로 출력을 작성할 때 문자열 보간을 활용할 수 있습니다.
echo "File '$file' contains this many occurrences of '$word': $count."
답변2
아무것도 시도하지 않았기 때문에 여기서는 추측을 해봅니다.
물결표 확장은 변수 arte가 확장되기 전에 확장되기 때문에 변수에서 약간 번거롭습니다.
물결표가 없는 파일 이름에도 문제가 없나요?
$location
또한 읽을 수 있는 파일인지 여부 와 같은 몇 가지 가정을 테스트하는 것이 좋습니다 . 유용한 메시지를 표시하고 종료할 수 있습니다. 이는 스크립트를 디버깅하는 데에도 도움이 될 수 있습니다.
답변3
tr -sc "\n$input" '[\n*]' <in | grep -xcFe"$input"
...이 작업을 매우 효율적으로 수행할 수 있습니다. 하지만 단순히 일치시키려는 경우에는 특히 좋지 않을 것입니다.모두성격. 이를 위해 다음을 수행할 수 있습니다.
tr \[:space:]\[:punct:] '[\n*]' <in | grep -xcFe"$input"
...아마도...
tr -c \[:alnum:]_ '[\n*]' <in | grep -xcFe"$input"
...당신에게 가장 적합한 것은 무엇이든 가능합니다.
답변4
나는 당신이 원한다고 생각하는 것을 달성하면서 몇 가지 기본적인 디버깅을 통해 당신이 하려는 일을 업데이트했습니다.
read -p "Please specify a location/file to be searched...Example=/var/tmp/test.txt : " location
while [[ ! -f ${location} ]] ; do
read -p "Unable to located file specified, please try again" location
done
read -p "Please specify a search term :" search
result=$(grep -w ${search} ${location} | wc -w)
echo "The search term ${search}, appears ${result} times inside of ${location}"