grep
저는 쉘 스크립팅을 처음 접했고 다양한 기능을 사용하는 방법에 대한 튜토리얼을 읽었습니다 . 불행하게도 대부분의 튜토리얼에서는 일반적으로 일부 패턴에 대해 텍스트 파일에서 문자열을 파악하는 방법을 논의합니다.
그러나 텍스트 파일에서 정확한 두 문자열을 검색하려고 합니다.
예를 들어, 내 콘텐츠는 다음과 같습니다 BookDB.txt
.
Three Little Pigs : Mary Jane
Cinderella : Paul Johnson
read
이 함수를 사용하여 사용자 입력을 얻으려고 합니다.
echo Title :
read Title
echo Author :
read Author
grep
다음으로 나는 도움을 받았던 명령을 사용했습니다 .협회BookDB.txt
문자열을 가져와 파일 에 존재하는지 확인 하고 echo $?
명령 출력을 변수에 할당하여 일부 메시지를 표시합니다.
grep -w "$Title" BookDB.txt
check1=`echo $?`
grep -w "$Author" BookDB.txt
check2=`echo $?`
if [ "$check1" -eq 0 ] && [ "$check2" -eq 0 ]; then
echo Found
else
echo Not Found
fi
Three
사용자가 및 를 Title
입력 하더라도 Mary
명령은 여전히 0을 반환합니다. 0을 반환할 때마다 텍스트 파일에 원하지 않는 정보를 Author
표시합니다 .echo$?
답변1
이 작업을 수행할 때:
check=`echo $?`
쉘이 확장되어 $?
명령을 형성 echo $?
한 다음 해당 출력을 변수에 할당하게 됩니다. 명령의 반환 상태를 저장하려면 중개인을 제거하고 다음을 수행하십시오.
check=$?
그러나 귀하의 경우에는 반품 상태를 저장할 필요가 없습니다. 명령문 자체를 if
테스트할 수 있습니다.&&
따라서 두 개의 문자열이 포함된 텍스트 파일을 찾으려면 다음을 수행하십시오.
if grep -qwF "$Author" "BookDB.txt" && grep -qwF "$Title" "BookDB.txt"; then
echo Yes
fi
이 옵션은 출력을 -q
억제 grep
하고 -F
패턴을 정규식으로 구문 분석하지 않습니다.
그러나 귀하의 예에 따르면 가장 많이 찾고 있는 것은 제목과 작성자 이름이 포함된 줄입니다. 따라서 다음을 시도해 볼 수 있습니다.
if grep -q "^\\s*$Title\\s*:\\s*$Author\\s*\$" "BookDB.txt"; then
echo yes
fi
이를 위해서는 사용자가 전체 제목과 전체 저자 이름을 입력하여 대소문자를 정확하게 입력해야 합니다. 어쩌면 당신은 좀 더 느슨한 것을 원할 수도 있습니다.
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
echo yes
fi
이제 대소문자를 구분하지 않고 전체 이름도 필요하지 않습니다( John
둘 john
다 일치함 JOHN CAVENDISH
). 제목도 마찬가지입니다.
MCVE 팔로우
echo Title:
read Title
echo Author:
read Author
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
echo Found
fi
다음 "BookDB.txt" 파일에 적용됩니다.
책 제목: 저자
이름 책 제목: 저자 이름
책 제목: 저자 이름
책: 저자 이름
테스트 케이스 book
와 author
.
답변2
알았어 너아직어떤 입력에서 어떤 출력을 원하는지 아직 언급되지 않았으므로 추측해야 합니다. 사용자가 Title="Three Little Pigs"
and (또는 파일의 다른 줄) 를 입력하면 한 가지 작업(예: "Found" 출력)을 수행하고 사용자 Author="Mary Jane"
가 Title="Cinderella"
and (또는 파일의 다른 줄)를 입력하면 다른 작업(예: "Not Found" 출력)을 수행하려는 Author="Paul Johnson"
것 같습니다. 파일의 줄) 사용자 입력다른 것
(예: Title="Three
및 Author="Mary"
, 또는 Title="Three Little Pigs"
및 Author="Paul Johnson"
). 나는 당신이 기반을 구축하는 것이 좋습니다phk의 답변그리고 할
if grep "^\s*$Title\s*:\s*$Author\s*$" BookDB.txt > /dev/null
then
echo "Found"
else
echo "Not Found"
fi
또는 첫 번째 줄을 다음으로 변경할 수 있습니다.
if grep -x "\s*$Title\s*:\s*$Author\s*" BookDB.txt > /dev/null
노트:
^
행의 시작을 나타냅니다.$
줄의 끝을 나타냅니다.- 따라서 다음을 나타냅니다.
^pattern$
pattern
전체 라인을 차지합니다. grep -x "pattern"
또한 나타냅니다pattern
전체 라인을 차지합니다. 당신이 읽었다면grep을 사용하여 정확한 문자열 일치-w
좀 더 자세히 살펴보면 및 를 혼동했음을 알 수 있습니다-x
.\s
공백 문자를 나타냅니다.\s*
0개 이상의 공백 문자를 나타냅니다.- 요약: 이 패턴은 줄 시작 부분에 0개 이상의 공백 문자, 제목, 0개 이상의 공백, 콜론, 0개 이상의 공백, 작성자 및 0개 이상의 공백이 뒤따르는 것을 의미합니다. 줄 기타 콘텐츠).
> /dev/null
일치하는 줄이 출력(즉, 화면)에 나타나는 것을 방지하는 데 사용됩니다 . ~처럼지우스티-q
(또는--quiet
또는--silent
) 옵션을 사용하여 이 작업을 수행할 수도 있습니다 .
지적한대로PHK, 제목이나 작성자 이름에 콜론이 포함되어 있거나 사용자가 정규 표현식에 특수 문자(예: ^
, $
, \
, *
, [
, ]
,.
, 또는 때로는 (
, )
, {
, }
및 ?
) +
.