次の構文は「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
tr
とその-s
オプションを使用して、連続するスペースを単一のスペースに圧縮し、その結果をgrep
にします。
$ echo 'Some spacious string' | tr -s ' ' | grep 'Some spacious string'
Some spacious string
ただし、これは隣接するスペースを完全に削除するのではなく、どちらか一方の端で単一のスペースに圧縮するだけです。
正規表現演算子+
を使用して、前のトークンの1つ以上、この場合はスペースを示します。したがって、パターンは\+
になります。
echo "Ambari Server running" | grep -i "Ambari \+Server \+running"
よくわからない場合は、プレーンなスペースだけでなく、すべての水平方向の空白に一致する文字クラス[:blank:]
を使用することをお勧めします。
echo "Ambari Server running" | grep -i "Ambari[[:blank:]]\+Server[[:blank:]]\+running"
一方、単語間にスペースを1つだけ残したい場合は、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}
はレコードを出力します
間のすべてのスペースを無視したい場合は、echo your text |tr -d [[:space:]]| grep "yourtext"
ですが、出力にはスペースがありません。例:
echo "Hi This Is Test" |tr -d [[:space:]] |grep HiThisIsTest
出力:
HiThisIsTest
How to match words and ignore multiple spaces?
の主な質問に答えるには、次のようなものが必要なものを取得するのに役立ちます。
echo "Ambari Server running" | tr '[:upper:]' '[:lower:]' | grep -E '\s*ambari\s+server\s+running\s*'
入力を受け取って小文字にしてから、小文字の一致を検索します。 0以上の空白(タブなどを含む)には\s*
を使用し、1つ以上の空白には\s+
を使用します。
入力が以下の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