Чтобы добавить еще один способ сделать это:
emacs -Q --batch -eval '(princ (base64-encode-string (read-string ": ")))'
Вы можете использовать команду sed для извлечения всех IP-адресов из IP-адреса, а затем использовать xargs для запуска whois для каждого соответствия:
sed 's/^.*SRC=\([0-9.]*\).*$/\1/;t;d' < /var/log/syslog | xargs -n1 whois >> output.txt
Кнопка [ f6] заменяет строки, содержащие SRC = xxxx только с IP-адресом.
Команды 't; d' пропускают несогласованные строки (тем самым избегая отдельной команды grep).
Команда xargs вызывает whois один раз для каждого адреса, который выдает sed.
В качестве альтернативы вы можете сначала найти и записать соответствующие строки, а затем извлечь ip-адреса отдельно:
grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`
Возможно, следующий код является подходящей отправной точкой для вас. Это, вероятно, не оптимальное решение, но оно выполняет свою работу.
Он состоит из цикла for по всем строкам вывода команды в $ (). В каждой итерации цикла одна строка вывода сохраняется в переменной IP. Затем в цикле команда whois вызывается с $ IP - содержимым переменной IP - как аргументом.
Скобки $ () заключают две команды grep - первый ищет IP-адреса с SRC = написано перед ними, а второе берет вывод первого (через канал |) и просто берет IP-адрес. Флаг -o grep заставляет его выводить только согласованную часть строк вместо полных строк.
Регулярное выражение также не очень элегантно. Он ищет три группы, каждая из которых состоит из одной-трех цифр и точки, за которой следуют от одной до трех цифр. Чтобы прочитать сценарий, я решил использовать расширенные регулярные выражения -E. «Нормальная» команда grep потребует обратную косую черту перед каждым раундом и фигурной скобкой ...
for IP in \
$(grep -E "SRC=([0-9]{1,3}\.){3}[[0-9]{1,3}" -o /var/log/syslog | \
grep -E "([0-9]{1,3}\.){3}[[0-9]{1,3}" -o);
do whois $IP;
done
Ваш скрипт должен выглядеть следующим образом:
#/bin/bash
grep 'SRC=' /var/log/syslog | awk 'BEGIN {FS="[ \t]+|\\|"} {print $13}' | uniq >> ~/topsecret001/pitbull001.txt
for ip in $(sed -e 's/SRC=//g' ~/topsecret001/pitbull001.txt)
do
whois $ip >> ~/topsecret001/pitbull002.txt
done
Для добавления опции - в случае появления «INVALID STATE» - будет ли это работать? :
awk '{
for (i = 1; i <= NF; i++)
if ($i ~ /^SRC=/)
print substr($i, 5)
}' /var/log/syslog | sort -u | while read ip;
do
printf ' INVALID STATE ' && printf ' === %s ===\n' "$ip"
whois "$ip"
done