Особое понимание команды sed

Nslookup — это программа для запроса серверов имен доменов в Интернете . Nslookup очень хорош для запросов DNS-серверов, но он не дает полной картины, когда дело доходит до разрешения имен.

В Linux разрешение имен чаще всего контролируется NSS , который настраивается с помощью /etc/nsswitch.conf. В частности, эта конфигурация содержит запись hosts. Например:

hosts:          files dns

В приведенной выше записи вы можете видеть, что первое, что нужно запросить, это files, за которым следует dns, что означает, что /etc/hostsбудет запрошено перед DNS. Существуют и другие варианты, включая LDAP , Multicast DNS и WINS .

Отвечая на ваш вопрос напрямую, SSH преобразует имя хоста в IP-адрес, используя NSS (, извлекая результаты из нескольких источников ), где nslookup запрашивает только DNS.

Вы можете проверить, какой IP NSS разрешает имя хоста в с помощью getent. Например, чтобы разрешитьsomename:

getent hosts somename

Также В случае SSH вы можете настроить информацию о хосте в /etc/ssh/ssh_configи ~/.ssh/config. Это даже позволит вам указать IP-адрес для имени хоста, полностью пропуская разрешение имени.:

Следующее указывает SSH использовать 192.168.1.25как для dev, так и для dev.example.com.SSH будет использовать этот адрес вне зависимости от того, эти имена существуют как DNS-имена для другого IP-адреса:

# contents of $HOME/.ssh/config
Host dev dev.example.com
    HostName 192.168.1.25

0
25.03.2021, 08:37
1 ответ

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

Выражение лица станет

000-212 444-818

в

212:000 818:444

Биты (...)являются «группами захвата». Такая группа захватывает подстроку, которая соответствует выражению внутри нее. Затем эта подстрока доступна через \1для первой группы, \2для второй и т. д.

Обе ваши группы захвата используют [0-9]+, который является шаблоном, который соответствует не -пустой последовательности цифр от 0 до 9, например, строке 123000.

-между двумя группами будет соответствовать буквальному тире в данных.

Строка замены использует числа, соответствующие группам, но использует их в порядке, обратном порядку, в котором они были сопоставлены, заменяя их местами. Текст замены также вставляет :вместо -между числами.

/gв конце заставляет sedповторить замену для всех неперекрывающихся -совпадений в данных.

Нестандартная -опция -Eдля sedзаставляет утилиту использовать расширенные регулярные выражения (ERE ), а не базовые регулярные выражения (BRE ), что является стандартом для sed. В ERE группы захвата пишутся (...), а BRE использует \(...\). BRE также не имеет +для указания не -пустой последовательности совпадений выражения, но вместо этого использует \{1,\}.

Таким образом, ваша команда также может быть записана переносимо как

sed 's/\([0-9]\{1,\}\)-\([0-9]\{1,\}\)/\2:\1/g'

или как

sed 's/\([0-9][0-9]*\)-\([0-9][0-9]*\)/\2:\1/g'
3
28.04.2021, 22:56

Теги

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