У меня есть фрагмент кода, который в основном берет файл с именем '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

1 ответ1

0

Похоже, вам нужно что-то вроде этого:

awk '
    NR == FNR {ip[$1]=1; next}
    $1 in ip {print; delete ip[$1]}
    END {
        for (i in ip) {
            system("host " i)
        }
    }
' srcip ~/db

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .