У меня очень большой список имен хостов, с которых я пытаюсь распечатать 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} '
Мне было любопытно, есть ли более элегантный способ сделать это.
С однимgrep (, если поддерживается PCRE ):
grep -Po '.*\.\K[^.]+$' listofhosts.txt
grep -oE '\.[^.]+$'
perl -lne 'print /(\.[^.\s]+)\s/'
sed 's/^[[:space:]]*[^[:space:]]\{1,\}\([.][^.[:space:]]\{1,\}\)[[:space:]]\{1,\}.*/\1/'
Если в вашем файле listofhosts.txt , а не нет комментариев в конце, то я бы сделал команду steeldriver с комментариями. Скажите awk разбить поля на периоды, а затем вывести значение последнего поля:
awk -F. '{print $NF}' listofhosts.txt
Результат:
net
com
info