Как я могу использовать sed / grep / awk для печати TLD из списка имен хостов, которые имеют TLD в разных полях?

У меня очень большой список имен хостов, с которых я пытаюсь распечатать TLD (.com, .net, .info и т. д.) каждого хоста. Проблема в том, что хосты имеют свои TLD в разных полях, поэтому я не могу сказать cut или awk для статической печати одного поля.

Некоторые примеры имен хостов:

examplehost.net                             # tld is 2nd field (period delimited)
subdomain.otherhost.com                      # tld is 3rd field
subdomain.othersubdomain.yetanotherhost.info   # tld is 4th field

В качестве небольшого обходного пути я просто добавил пробел в конец каждого хоста, чтобы я мог включить его в свой шаблон регулярного выражения и grep для него.

sed 's/$/ /g' listofhosts.txt | grep -Eo '\.[a-z]{1,10} '

Мне было любопытно, есть ли более элегантный способ сделать это.

0
07.06.2017, 18:46
3 ответа

С однимgrep (, если поддерживается PCRE ):

grep -Po '.*\.\K[^.]+$' listofhosts.txt 
0
28.01.2020, 02:45
grep -oE '\.[^.]+$'

perl -lne 'print /(\.[^.\s]+)\s/'

sed 's/^[[:space:]]*[^[:space:]]\{1,\}\([.][^.[:space:]]\{1,\}\)[[:space:]]\{1,\}.*/\1/'
0
28.01.2020, 02:45

Если в вашем файле listofhosts.txt , а не нет комментариев в конце, то я бы сделал команду steeldriver с комментариями. Скажите awk разбить поля на периоды, а затем вывести значение последнего поля:

awk -F. '{print $NF}' listofhosts.txt

Результат:

net
com
info
1
28.01.2020, 02:45

Теги

Похожие вопросы