Linux에서 Bash 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법
때때로 Linux 스크립트에서 텍스트 문자열에 더 작은 특정 문자열이 포함되어 있는지 알고 싶을 때가 있습니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 몇 가지 간단하고 신뢰할 수 있는 기술을 보여드리겠습니다.
이것이 유용한 이유는 무엇입니까?
문자열에서 더 작은 하위 문자열을 검색하는 것은 일반적인 요구 사항입니다. 한 가지 예는 스크립트가 다음에 수행할 작업을 결정할 수 있도록 파일 또는 사람의 입력에서 텍스트를 읽고 문자열에서 특정 하위 문자열을 검색하는 것입니다. 구성 파일에서 레이블 또는 장치 이름을 찾거나 사용자의 입력 라인에서 명령 문자열을 찾을 수 있습니다.
Linux 사용자는 텍스트 조작을 위한 여러 가지 유틸리티를 누릴 수 있습니다. 일부는 Bash 셸에 내장되어 있고 나머지는 독립 실행형 유틸리티 또는 응용 프로그램으로 제공됩니다. Unix에서 파생된 운영 체제에 문자열 조작 기능이 풍부하게 제공되는 이유가 있습니다.
파일로 보이는 것 중 일부는 단순한 파일이 아닙니다. 하드웨어 장치 및 시스템 정보 소스와 같은 것을 나타내는 특수 파일입니다. 운영 체제가 수행하는 추상화는 파일의 모양과 특성을 제공합니다. 당연히 텍스트로 정보를 읽을 수 있고 어떤 경우에는 쓸 수도 있지만 일반 파일은 아닙니다.
텍스트는 터미널 창에서 명령의 입력 및 출력으로도 사용됩니다. 이를 통해 입력 및 출력의 방향 전환 및 배관이 가능합니다. 이 기능은 한 명령의 출력을 다음 명령의 입력으로 전달하여 Linux 명령 시퀀스를 함께 연결하는 기능을 뒷받침합니다.
출처에 관계없이 수신한 텍스트에서 중요한 단어, 명령, 레이블 또는 기타 표시기를 검색하는 것은 텍스트 기반 데이터를 처리하는 데 있어 표준적인 부분입니다. 다음은 자신의 스크립트에 포함할 수 있는 간단한 기술 모음입니다.
Bash 내장으로 하위 문자열 찾기
이중 괄호 [[...]]
문자열 비교 테스트는 if
문에서 한 문자열에 다른 문자열이 포함되어 있는지 확인하는 데 사용할 수 있습니다.
이 스크립트를 편집기에 복사하고 double.sh라는 파일에 저장합니다.
#!/bin/bash if [[ "monkey" = *"key"* ]]; then echo "key is in monkey" else echo "key is not in monkey" fi
chmod
명령으로 스크립트를 실행 가능하게 만들어야 합니다. 이것은 스크립트를 실행 가능하게 만드는 데 항상 필요한 단계입니다. 스크립트 파일을 만들 때마다 이 작업을 수행해야 합니다. 각 경우에 적절한 스크립트의 이름을 대체하십시오.
chmod +x double.sh
스크립트를 실행해 봅시다.
./double.sh
이것은 별표 ” *
”가 문자를 포함하지 않는 일련의 문자를 나타내기 때문에 작동합니다. 하위 문자열 key가 대상 문자열 내에 있으면 앞이나 뒤에 문자가 있거나 없는 경우 테스트에서 true를 반환합니다.
이 예에서는 하위 문자열 앞에 문자가 있습니다. 이들은 첫 번째 별표와 일치합니다. 하위 문자열 뒤에 문자가 없지만 별표도 일치하는 문자가 없기 때문에 테스트는 여전히 통과합니다.
유연성을 위해 리터럴 문자열 대신 변수를 처리하도록 스크립트를 수정할 수 있습니다. 이것은 double2.sh 스크립트입니다.
#!/bin/bash string="Monkey" substring="key" if [[ $string = *$substring* ]]; then echo "$substring was found in $string" else echo "$substring was not found in $string" fi
어떻게 실행되는지 봅시다.
./double2.sh
이것은 리터럴 문자열 대신 변수 이름을 사용할 수 있다는 이점과 함께 동일한 방식으로 작동합니다. 우리의 작은 솔루션을 함수로 바꾸면 최고의 유연성을 제공할 것입니다.
이것은 double3.sh 스크립트입니다.
#!/bin/bash shopt -s nocasematch string="Monkey" substring="Key" capital="London" check_substring () { if [[ $1 = *$2* ]]; then echo "$2 was found in $1" else echo "$2 was not found in $1" fi } check_substring "Monkey" "key" check_substring $string $substring check_substring $string "banana" check_substring "Wales" $capital
변수와 리터럴 문자열을 혼합하여 check_substring
함수를 호출합니다. 대소문자를 구분하지 않도록 nocasematch
를 설정하기 위해 shopt
를 -s
(설정) 옵션과 함께 사용했습니다.
실행 방법은 다음과 같습니다.
./double3.sh
case
문에서 하위 문자열을 별표로 감싸는 트릭을 사용할 수도 있습니다. 이것은 case.sh입니다.
#!/bin/bash shopt -s nocasematch string="Wallaby" substring="Wall" case $string in *$substring*) echo "$substring was found in $string" ;; *) echo "Nothing matched: $string" ;; esac
매우 긴 if
문 대신 case
문을 사용하면 스크립트를 더 쉽게 읽고 디버그할 수 있습니다. 문자열에 가능한 많은 하위 문자열 중 하나가 포함되어 있는지 확인해야 하는 경우 case
문이 최선의 선택입니다.
./case.sh
하위 문자열이 발견되었습니다.
grep으로 하위 문자열 찾기
Bash 내장 기능 외에 가장 먼저 접할 수 있는 텍스트 검색 도구는 grep
입니다. 우리는 하위 문자열을 찾기 위해 문자열 내에서 문자열을 검색하는 grep
의 타고난 기능을 사용할 수 있습니다.
이 스크립트는 subgrep.sh라고 합니다.
#!/bin/bash string="porridge pot" substring="ridge" if $(echo $string | grep -q $substring); then echo "$substring was found in $string" else echo "$substring was not found in $string" fi
스크립트는 echo
를 사용하여 하위 문자열을 검색하는 grep
으로 문자열을 보냅니다. 우리는 -q
(quiet) 옵션을 사용하여 grep
이 표준 출력에 아무것도 쓰지 않도록 합니다.
괄호 (...)
안의 명령 결과가 0이면 일치 항목이 발견되었음을 의미합니다. 0은 Bash에서 true
와 같기 때문에 if
문이 충족되고 then
절이 실행됩니다.
출력이 무엇인지 봅시다.
./subgrep.sh
sed로 하위 문자열 찾기
sed
를 사용하여 하위 문자열도 찾을 수 있습니다.
기본적으로 sed
는 입력된 모든 텍스트를 인쇄합니다. sed -n
을 사용하면 이를 방지할 수 있습니다. 인쇄되는 유일한 행은 일치하는 행입니다. 이 표현식은 $substring의 값과 일치하거나 해당 값을 포함하는 모든 행을 인쇄합니다.
"/$substring/p"
<<<
여기 리디렉션을 사용하여 $string
의 값을 sed
에 공급합니다. 현재 셸에서 값을 명령으로 리디렉션하는 데 사용됩니다. 파이프가 하는 방식으로 서브쉘을 호출하지 않습니다.
첫 번째 -n
은 테스트입니다. sed
명령의 출력이 0이 아니면 true
를 반환합니다. sed
의 출력이 0이 아닌 유일한 방법은 일치하는 줄이 발견된 경우입니다. 이 경우 $substring
이 $string
에서 발견되었을 것입니다.
이것은 subsed.sh입니다.
#!/bin/bash string="Sweden" substring="eden" if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; then echo "$substring was found in $string" else echo "$substring was not found in $string" fi
스크립트를 실행할 때 예상되는 응답을 얻습니다.
./subsed.sh
비교가 실패하도록 $substring
의 값을 편집하여 스크립트의 논리를 테스트할 수 있습니다.
./subsed.sh
검색 중지, 찾았습니다.
다른 도구는 awk
및 Perl
과 같은 하위 문자열을 찾을 수 있지만 하위 문자열 찾기와 같은 간단한 사용 사례는 추가 기능이나 추가된 복잡성을 보증하지 않습니다. 특히 Bash 내장 기능을 사용하여 하위 문자열을 검색하는 것은 빠르고 간단하며 외부 도구가 필요하지 않습니다.