awk
имеет параметр -v
для установки переменных. Чтобы установить переменную $ i
в awk
, вы должны сказать awk -vi = $ i
, а затем в операторе awk
просто ссылаться на переменную как i
, а не как $ i
.
Я не тестировал следующее, но попробуйте следующее:
used_pages="$(awk -v i=$i '/i/{nr[NR+9]}; NR in nr' LIST.txt)"
Нет специальной программы, которая анализирует этот файл.
Ряд стандартных файлов (, например./etc/hosts
)анализируются стандартными библиотечными файлами (, например.gethostbyname(3)
). Однако история может быть намного сложнее.
Разрешение имени хоста обычно контролируется записью в /etc/nsswitch.conf
.
напр.
% grep hosts /etc/nsswitch.conf
hosts: files dns
Эта запись указывает подпрограммам распознавателя использовать серверную часть «файлы» и, если результат там не найден, выполнить поиск в DNS. Другие значения могут быть помещены туда (, например. ldap
или nis
), которые могут изменить способ поиска имен хостов.
Эти подпрограммы обычно называются «службами именования». Те же концепции также используются для поиска имени пользователя (passwd
), записей групп(group
)и так далее.
Таким образом, когда вы выполните ping a.remote.host
, программа ping
вызовет библиотечную функцию glibc, которая загрузит подпрограммы, определенные в nsswitch.conf
.В результате вы не увидите конкретной программы для поиска; ping
делает всю работу сам, через библиотеку и подпрограммы NS.
Существует программа под названием getent
, которую можно использовать для поиска по имени; вы указываете «базу данных» (одну из записей вnsswitch.conf
)и значение, которое вы хотите найти.
Итак,
getent hosts a.remote.host
выполнит поиск имени в соответствии с правилами, определенными в nsswitch.conf
. Это полезно для целей тестирования, а иногда и в сценариях.
---дополнение----
Эта информация взята из комментария Стивена ниже, но она очень полезна, поэтому я добавляю ее к его ответу.
strace getent hosts www.google.com 2>&1 | grep libnss_
сообщит, какая библиотека (или никакая )не использовалась для разрешения имени. Если написано libnss_files
, значит, использовалось /etc/hosts
. Если указано libnss_dns
, значит, использовался DNS. libnss_myhostname
означает, что ничего не сработало, и резервная система GNU выкинула (и, возможно, вышла из строя ). Если библиотеки нет в списке, то, вероятно, вы использовали числовой адрес, например 127.0.0.1
, поэтому преобразователь не понадобился.
В системах GNU/Linux /etc/hosts
обычно читается библиотеками glibc
.
См. документацию GNU по этому вопросу:
Internally, the system uses a database to keep track of the mapping between host names and host numbers. This database is usually either the file /etc/hosts or an equivalent provided by a name server. The functions and other symbols for accessing this database are declared in netdb.h. They are BSD features, defined unconditionally if you include netdb.h.
Все POSIX-совместимые UNIX и UNIX -подобные системы будут следовать этому правилу, поскольку netdb.h является стандартом POSIX . Основное отличие заключается в используемой ими библиотеке C, так как не все системы UNIX используют glibc
.
В документации GNU также говорится о таких функциях, как gethostbyname
и gethostbyaddr
, которые считывают данные, собранные из /etc/hosts
. Эти две функции фактически устарели сегодня. Вместо этого следует использоватьgetaddrinfo
и getnameinfo
.