단어를 일치시키고 여러 공백을 무시하는 방법은 무엇입니까?

단어를 일치시키고 여러 공백을 무시하는 방법은 무엇입니까?

다음 구문은 "Ambari Server running"과 일치해야 하는데 단어 사이에 공백이 여러 개 있으면 어떻게 일치합니까? 단어 사이의 공백을 무시하는 방법은 무엇입니까?

echo "Ambari Server      running"  | grep -i "Ambari Server running"
echo "Ambari     Server running"   | grep -i "Ambari Server running"
echo "     Ambari Server running"  | grep -i "Ambari Server running"

예상되는 결과는 다음과 같습니다.

Ambari Server running
Ambari Server running
Ambari Server running

답변1

tr-s연속된 공백을 단일 공백으로 압축하는 옵션과 함께 사용하면 grep결과는 다음과 같습니다.

$ echo 'Some   spacious  string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string

그러나 이렇게 하면 측면 공간이 완전히 제거되지는 않으며 양쪽 끝의 단일 공간으로만 압축됩니다.

sed측면 공간을 제거하고 내부 공간을 단일 공간으로 압축하는 데 사용됩니다 .

echo ' Some   spacious  string' |
sed 's/^[[:blank:]]*//; s/[[:blank:]]*$//; s/[[:blank:]]\{1,\}/ /g'

그런 다음 에 전달될 수 있습니다 grep.

답변2

정규식 연산자를 사용하여 +하나 이상의 선행 토큰(이 경우 공백)을 나타냅니다. 따라서 패턴은 다음과 같습니다 \+.

echo "Ambari Server      running"  | grep -i "Ambari \+Server \+running"

[:blank:]확실하지 않은 경우 일반 공백뿐만 아니라 가로 공백과 일치하는 문자 클래스를 사용하는 것이 좋습니다.

echo "Ambari Server      running"  | grep -i "Ambari[[:blank:]]\+Server[[:blank:]]\+running"

반면, 단어 사이에 공백을 유지하려면 다음을 사용하세요 awk.

echo "Ambari Server      running"  | \
    awk '$1=="Ambari" && $2=="Server" && $3=="running" {$1=$1; print}'
  • $1=="Ambari" && $2=="Server" && $3=="running"필수 필드 3개를 일치시키세요.

  • {$1=$1}공백을 새 구분 기호로 사용하여 레코드를 다시 작성합니다.

  • {print}기록 인쇄

답변3

사이에 있는 모든 공백을 무시하려면 this 를 사용할 수 있지만 echo your text |tr -d [[:space:]]| grep "yourtext"출력에는 공백이 없습니다. 예:

echo "Hi This   Is Test" |tr -d [[:space:]] |grep HiThisIsTest

산출:

HiThisIsTest

답변4

다음과 같은 주요 질문 에 답하면 How to match words and ignore multiple spaces?필요한 것을 얻는 데 도움이 됩니다.

echo "Ambari Server      running"  | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*'

입력을 받아 소문자로 만든 다음 소문자로 일치하는 항목을 검색합니다. 우리는 \s*0개 이상의 공백(탭 등도 포함)과 \s+1개 이상의 공백을 사용합니다.

입력이 다음과 같은 파일에 있는 경우 foo2.txt:

Ambari Server      running 
Ambari     Server running
     Ambari Server running

그러면 다음과 같이 할 수 있습니다:

cat foo2.txt | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*'
ambari server      running
ambari     server running
     ambari server running

계산에만 관심이 있는 경우 이를 약간 수정하여 다음과 같이 할 수 있습니다.

cat foo2.txt | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*' | wc -l

관련 정보