次のような内容のファイルがあります。
mail.google.com
srv1.mail.google.com
google.com
facebook.com
yahoo.com
tt.twitter.com
サブドメインのある行を検索したいです。私は次のコマンドを使用しました。
grep -e '(.\.)*.\..$' test.txt
コマンドの詳細:
(.\.)*
:文字の後にドットが複数回来る場合。.\..$
:ランダムな文字の後にドットが来てからランダムな文字
探したい文字列パターンの例:
mail.google.com
srv1.mail.google.com
しかし、何も見つかりませんでした。私が探している出力はサブドメインを持つ行でなければなりません。
mail.google.com
srv1.mail.google.com
tt.twitter.com
答え1
以下を試してください。
grep -E '(.+\.)+.+\..+$' test.txt
出力:
mail.google.com
srv1.mail.google.com
tt.twitter.com
詳細:
(.+\.)+
- 後にドットが続く文字は、そのグループを1回以上検索します。.+\.
- 任意の文字が1回以上登場し、その後にピリオドが続きます。.+$
- ランダムな文字が1回以上出て行が終わります。
正規表現の問題は次のとおりです。
(.\.)*
- ピリオドの後に続くすべての文字と一致します。ただし、*
0回以上一致することもあります。あなたが望むかもしれません+
。.\.
- 正確に一致一つ文字、ピリオド。+
最初の.
().+
の後の文字が1つ以上の文字と一致するようにします。.$
- 正確に一致一つ文字を入力し、行の終わりを入力します。+
()の後の1が1つ以上の文字と一致するようにします。.
.+
答え2
基準を「少なくとも2つのピリオドのある行」に減らすには、単純なgrepを使用できます。
grep -E '\.[^.]+\.' < file
これにより、拡張正規表現がアクティブになり、ピリオド、1つ以上のピリオドではない項目、ピリオドが順番に表示されます。ピリオドの両側に特定の数の文字を表示する必要があるため、これをさらに強化できます。
grep -E '.\.[^.]+\..' < file
上記の方法は、次の入力に対する偽の肯定を防止します。
foo.com.
または.com。
に基づいてこのスタックオーバーフローの回答2014年現在、TLDはすべて数字ではありませんが(理論的には)単一文字である可能性があるため、以下を使用できます。
grep -E '\.[^.]+\.[[:alpha:]]'