grep을 사용하여 텍스트 파일에서 정확한 문자열 2개를 확인하세요.

grep을 사용하여 텍스트 파일에서 정확한 문자열 2개를 확인하세요.

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

이제 대소문자를 구분하지 않고 전체 이름도 필요하지 않습니다( Johnjohn다 일치함 JOHN CAVENDISH). 제목도 마찬가지입니다.


MCVE 팔로우

echo Title:
read Title
echo Author:
read Author
if grep -qi "$Title.*:.*$Author" "BookDB.txt"; then
    echo Found
fi

다음 "BookDB.txt" 파일에 적용됩니다.

책 제목: 저자
이름 책 제목: 저자 이름
책 제목: 저자 이름
책: 저자 이름

테스트 케이스 bookauthor.

답변2

알았어 너아직어떤 입력에서 어떤 출력을 원하는지 아직 언급되지 않았으므로 추측해야 합니다. 사용자가 Title="Three Little Pigs"and (또는 파일의 다른 줄) 를 입력하면 한 가지 작업(예: "Found" 출력)을 수행하고 사용자 Author="Mary Jane"Title="Cinderella"and (또는 파일의 다른 줄)를 입력하면 다른 작업(예: "Not Found" 출력)을 수행하려는 Author="Paul Johnson" 것 같습니다. 파일의 줄) 사용자 입력다른 것 (예: Title="ThreeAuthor="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, 제목이나 작성자 이름에 콜론이 포함되어 있거나 사용자가 정규 표현식에 특수 문자(예: ^, $, \, *, [, ],., 또는 때로는 (, ), {, }?) +.

관련 정보