Я использую этот код awk, чтобы выбрать IP-адрес в файле / etc / hosts, и хотя я могу заставить его соответствовать правильному имени хоста, awk выберет «почти подобное» имя хоста, если увидит его первым. Я исследовал это, и я не могу понять это.
sUSER=machine_005
ip=$(awk '/^[[:space:]]*($|#)/{next}/'$sUSER'/{print $1; exit}' /etc/hosts)
Я знаю, что первая часть ищет $ или # и, если найден, вызывает следующую строку. Эта функция необходима в окончательной формуле. Другая необходимая функция - остановка после первого матча.
Я знаю, что следующий / xxx / ищет шаблон и, если он найден, печатает от $ 1 до $ ip.
Вот пример файла моего хоста
555.555.555.555 machine.005
222.222.222.222 machine_005
если я $sUSER=machine_005
$ip
- это 222.222.222.222
точно так же, как вы ожидаете.
если я $sUSER=machine.005
$ip
это 555.555.555.555
точно так же, как вы ожидаете
Но если мой / etc / hosts:
222.222.222.222 machine_005
555.555.555.555 machine.005
Тогда, если я $sUSER=machine_005
$ip
будет 222.222.222.222
, как вы и ожидаете.
Однако, если I $sUSER=machine.005
$ip
равен 222.222.222.222
Требуется machine_005
IP-адрес.
Может ли это быть ошибкой? или это специально?
Спасибо.
Hello. Я хотел опубликовать свою последнюю строку кода, которая обеспечивает правильный вывод. Я ценю всю помощь и руководство от тех, кто ответил. Я хотел опубликовать окончательный код на случай, если кто-то в будущем может найти его полезным.
ip=$(awk -v sUSER=$sUSER 'BEGIN{gsub(/\./,"\\.",sUSER)}match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) && $0 ~ ("[^[:alpha:]]"sUSER"$") && $0 !~ /^$/ && $0 !~ /^#/{print $1}' /etc/hosts)