getent hosts взять начальные 3 цифры + имя хоста unix

Мне нужны первые 3 октета IP-адреса и имя myhosts, в то время как я пытаюсь сделать это с помощью команды cut, но не могу присоединиться к имени хоста.

$ getent hosts myhosts
172.10.2.32    myhosts.lab.com

все с awk, sed, cut, python будет в порядке

$ getent hosts myhosts | cut -d "." -f1,2,3
172.10.2

Вывод должен быть:

172.10.2  myhosts.lab.com

person Community    schedule 11.08.2016    source источник


Ответы (2)


В первом поле убираем все от последней точки:

$ awk '{sub(/\.[^.]*$/,"",$1); print $1, $2}' <<< "172.10.2.32    myhosts.lab.com"
172.10.2 myhosts.lab.com

У нас есть два поля: IP и имя хоста. Имя хоста должно быть возвращено без каких-либо изменений, тогда как для IP мы хотим удалить последний блок.

Для настройки первого поля $1 мы используем sub(). Это выполняет замены, используя синтаксис sub(regexp, replacement [, target]). Чтобы удалить все из последней точки, мы заменяем ее пустой строкой.

И как нам сопоставить все, начиная с последней точки? Использование /\.[^.]*$/, что означает: сопоставьте точку, а затем любые символы, кроме точки до конца поля.

person fedorqui 'SO stop harming'    schedule 11.08.2016
comment
Я отредактировал его следующим образом, что дает тот же результат.. { $ getent hosts myhosts | awk '{sub(/\.[^.]*$/,"",$1); print $0}' 172.10.2 myhosts.lab.com } - person ; 11.08.2016
comment
Пожалуйста, объясните регулярное выражение, если это возможно - person ; 11.08.2016
comment
Добавлено объяснение @KarnKumar - person fedorqui 'SO stop harming'; 11.08.2016
comment
@fedorquie .. Большое спасибо. - person ; 11.08.2016

$ sed -E 's/\.[0-9]+ +/ /' <<< '172.10.2.32    myhosts.lab.com'
172.10.2 myhosts.lab.com

или если пробел в выводе вашей команды может содержать вкладки или другие невидимые символы:

$ sed -E 's/\.[0-9]+[[:blank:]]+/ /' <<< '172.10.2.32    myhosts.lab.com'
172.10.2 myhosts.lab.com
person Ed Morton    schedule 11.08.2016
comment
Отличное решение Sed, спасибо. - person ; 12.08.2016