単語を一致させ、複数のスペースを無視する方法は?

単語を一致させ、複数のスペースを無視する方法は?

次の構文は「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

関連情報