У меня есть фрагмент кода, который в основном берет файл с именем 'srcip' (который представляет собой просто список IP-адресов) и сравнивает его с моим файлом '~/db', который является просто базой данных IP HOSTNAME с разделителями табуляции серверов, которые у нас есть. в нашей среде. Цель состоит в том, чтобы взять файл 'srcip' и сопоставить его с тем, что находится в файле ~/db, чтобы получить имя хоста. Он работает нормально, но есть много IP-адресов, которые намеренно отсутствуют в файле ~/db из-за проблем DHCP, поэтому нам нужен реальный поиск хоста с помощью команды host
. Что я хотел бы, так это в основном вставить оператор if в этот код awk, который проверит, не совпадает ли IP в БД, а затем выполнить команду host для этого ip и выдать мне вывод. Как я могу сделать это здесь?
awk 'FNR==NR {a[$1]=$2; next} $1 in a && a[$1]!=$2 {print $1, a[$1], $2}' OFS="\t" srcip ~/db
Я знаю, что awk может использовать операторы if
подобные приведенным ниже, чтобы проверить, есть ли у системных пользователей оболочка /bin /bash:
awk -F':' '{ if ($3 < '500' && $7 != "/bin/bash" ) print $0 }' /etc/passwd
Как уже говорилось, мне нужно использовать что-то, что быстро анализирует эти данные, например awk или sed, и не полагаться на какие-либо циклы. Пожалуйста, имейте в виду, что я уже могу сделать это с помощью цикла while, но, учитывая природу цикла while, он анализирует его построчно и медленно для нашего использования, поскольку у нас есть почти 100 000 IP-адресов для анализа за раз, если не больше. Для 2000 строк я могу запустить этот кусок кода, но опять же это не то, что я хочу сделать:
#!/bin/bash
while read this_IP_address
do
db_host=$(grep "^$this_IP_address" ~/db | awk -F ' ' '{print $2}')
if [ "$db_host" = "" ]
then
host $this_IP_address | head -n 1 | awk -F ' ' '{print $5}'
else
echo $db_host
fi
done