다음 구문은 "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