Shell

使用 awk 或 sed 刪除子域

  • July 29, 2022

如何刪除文本文件中的所有子域?我想我需要刪除之前的所有內容,包括“。”?

輸入:

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

預期輸出:

stackexchange.com
example.org
example.tld

編輯:

沒有子域的域應該保持不變。只有當它有一個子域時,才應該觸及整個域。換句話說,兩個“.”或更多。

google.com 必須保持 google.com 輸入:

google.com
mail.google.com

預期輸出:

google.com
google.com

樣本數據

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

保留最後兩個頂級域名,

使用sed

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

在哪裡

  • .*\.貪婪匹配任何字元(包括點)和點
  • \( \)記住匹配的字元串
  • .*\..*any char(1) 多次,一個點 any char 多次
  • (1) 由於上面的貪心,不會匹配 dot 。
  • \1回憶第一個記住的字元串

使用(gnu)grep

grep -Eo '[^.]*.[^.]*$' data
google.com
mit.edu
  • 正則表達式模式 ( [^.]*.[^.]*$) 主要與上面的內容相同,除了$哪個錨點位於行尾。

刪除第一個子域,使用sed(留作資訊,規範已更改)

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

在哪裡

  • ^[^.]*\.讀作^行首,[^.]而不是一個.*多次,\. 一個點
  • 取而代之的是什麼。
  • 如評論中所述,sed可以縮短為's/[^.]*.//'(前提是行不以 dot 開頭)。

如果要剝離第一個子域:

cut -d . -f 2- input

如果您有多個級別的子域,sub2.sub1.domain.com您可以cut結合使用rev來保留域的最後兩個元素:

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

引用自:https://unix.stackexchange.com/questions/711614