awkまたはsedを使用してサブドメインを削除する

awkまたはsedを使用してサブドメインを削除する

テキストファイルのすべてのサブドメインを削除する方法は? 「.」を含むその前のすべての項目を削除する必要があると思いますか?

入力する:

unix.stackexchange.com
www.example.org
example.example.tld

予想出力:

stackexchange.com
example.org
example.tld

編集する:

サブドメインのないドメインは変更されていないままにしてください。ドメイン全体にサブドメインがある場合にのみタッチする必要があります。つまり、「.」が2つ以上

google.comはgoogle.comの入力を維持する必要があります。

google.com
mail.google.com

予想出力:

google.com
google.com

答え1

最初のサブドメインを削除するには、次の手順に従います。

cut -d . -f 2- input

複数のレベルのサブドメインがある場合は、組み合わせを使用してドメインの最後の2つの要素を保存sub2.sub1.domain.comできます。cutrev

rev input | cut -d . -f -2 |  rev

答え2

サンプル

www.google.com
prep.ai.mit.edu

最後の2つのトップレベルドメインを維持し、

使用sed

sed 's/.*\.\(.*\..*\)/\1/'

どこ

  • .*\.Greedyはすべての文字(ドットを含む)とドットと一致します。
  • \( \)一致する文字列を覚えてください
  • .*\..*任意の文字を複数回使用(1)、任意の文字を複数回使用
  • (1) 上記の貪欲によりポイントが一致しません。
  • \1最初に記憶された文字列を呼び出します。

使用(gnu)grep

grep -Eo '[^.]*.[^.]*$' data
google.com
mit.edu
  • 正規表現パターン()は、行の末尾にアンカーがあることを[^.]*.[^.]*$除いて、ほとんど上記のように読み取られます。$

最初のサブドメインの削除、使用sed(情報の保持、仕様変更)

sed -e 's/^[^.]*\.//' data
google.com
ai.mit.edu

どこ

  • ^[^.]*\.点ではなく行^の始まりとして発音され、点として数回発音されます。[^.].*\.
  • 何も置き換えられませんでした。
  • コメントで述べたように、これは(行がドットで始まらない場合)sedに短縮することができます。's/[^.]*.//'

答え3

.そのフィールドが行の区切られた最後の2つのフィールドになると判断された場合は、次のものを使用できます。

$ awk -F. -v OFS='.' '{print $(NF-1),$NF}' file
stackexchange.com
example.org
example.tld

またはsed:

$ sed 's/.*\.\([^.]*\..*\)$/\1/' file
stackexchange.com
example.org
example.tld

そして、sedサポートしている場合は-E少しきれいになります。

 sed -E 's/.*\.([^.]*\..*)$/\1/' file
stackexchange.com
example.org
example.tld

答え4

基準を使用して、sed最後と最後の2番目のコンポーネントを除くすべてのコンポーネントを削除します。

sed 's/.*\.\(.*\..*\)/\1/'

残念ながら、この正規表現は嵐の後の森のように見えます。段階的に構築しましょう:

  • .*\.ドットで終わる任意の数の文字(ドットを含む)です。
  • 式の後には別の点が必要なので、.*\.最初から2番目の点まですべてが一致します。
  • 今、私たちは行の残りの部分に1つの点しかないと確信しています(文字通り点なので、.*\..*残りの部分と一致させるのに十分です)。
  • \(\)交換時にリサイクルできるように、この残骸を内部に入れ、残り\1はすべて捨てます。

視覚的な説明:

subdomain.domain.tld
sub1.sub2.domain.tld
`--v----´ `-v--´ `v´
   .*   \.  .* \. .*

関連情報