次の構文は「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
正規表現演算子を使用して、+
1つ以上の先行トークン(この場合は空白)を表します。したがって、パターンは次のようになります\+
。
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*
スペース(タブなども含む)と\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