2015-09-17 4 views
0

Я пытаюсь написать сценарий, который извлекает данные из файла «nohup.out», используя tail -f и выполняя команду dig при условии.Передайте аргумент, если условие используется в трубе

#!/bin/bash 
nohup proxychains firefox 

tail -f nohup.out | xargs if [[ {} == *"denied"* ]] 
    then 
     dig -x `cut -d '-' -f 6 {} | cut -d ':' -f 1`&; 
    fi 

Выход nohup.out является

| S-цепи | - <> -10.1.1.16: 80- <> <> -93.184.220.29: 80- < --denied

| S-цепи | - <> -10.1.1.16: 80- <> <> -93.184.220.29: 80- < --denied

| S-цепи | - <> -10.1.1.16: 80- <> <> -216.58.209.77: 443- <> <> -OK

| S-цепи | - <> -10.1.1.16: 80- <> <> - 46.28.247.89:443- <> <> -OK

с ниже команды я могу извлечь IP для обратного DNS поиска.

cut -d '-' -f 6 | cut -d ':' -f 1 

Я не могу найти способ передать аргумент cut и if command.

+0

Проблема очень похожа на ту, что в [Почему я не могу использовать Unix 'nohup' с Bash' for' loop?] (Http://stackoverflow.com/questions/3099092/), и ответ и обходной путь практически одинаковый. Вероятно, вам также необходимо использовать 'xargs -I '{}' ...'. –

+0

nohup используется для запуска firefox с proxychains здесь, это не имеет никакого отношения к более позднему скрипту. В более позднем скрипте я читаю вывод nohup.out. – DarKnight

+1

Я этого не говорил; но проблема в другом вопросе заключается в том, как использовать встроенный Bash - в этом случае цикл 'for' вместо оператора' if' в этом случае - с командой, которая принимает другую команду в качестве аргумента ('nohup 'в другом вопросе,' xargs' в этом вопросе). Тот факт, что ваша команда 'tail -f' читает' nohup.out', полностью тангенциальна. –

ответ

1

Что вам нужно, чтобы преобразовать if утверждение в качестве аргумента bash. Делая упрощенным преобразования, при условии, что код в вопросе есть шанс работать, вы получите:

tail -f nohup.out | 
xargs -I '{}' bash -c "if [[ {} == *"denied"* ]]; then dig -x $(cut -d '-' -f 6 {} | cut -d ':' -f 1) & fi" 

Это точно так же основное лечение, как это было необходимо для for цикл выполняется nohup - вам нужна оболочка для запуска встроенной команды. См. Why can't I use Unix nohup with Bash for loop? для точно аналогичной ситуации.

Однако при дальнейшем отражении вы хотите вырезать строку, которая является IP-адресом, а не файлом с именем в качестве имени, поэтому команде необходимо эхо-строку передать в команды cut. Вы также должны разорвать волосы, выполняя правильные подкоманды; вам нужна обратная косая черта перед $ из $(…) или перед каждым обратным тиком, если вы настаиваете на использовании нотации `…`, а также с помощью обратной косой черты с двойным кавычкой для защиты угловых скобок в строке.

tail -f nohup.out | 
xargs -I '{}' bash -c "if [[ '{}' != *denied* ]]; then echo dig -x \"\$(echo '{}' | cut -d '-' -f 6 | cut -d ':' -f 1)\" & fi" 

Теперь мы должны обсудить использование условия и двух cut команд (и общей потери волос).Вы можете использовать:

tail -f nohup.out | 
grep -v denied | 
xargs -I '{}' bash -c "echo dig -x \$(echo '{}' | cut -d '-' -f 6 | cut -d ':' -f 1) &" 

или, более здраво:

tail -f nohup.out | 
awk -F '[-:]' '/denied/ { next } { print "dig -x " $7 " &" }' | 
sh -x 

или любой из множества других способов сделать это.

+0

Все вышесказанное показывает некоторую ошибку (я заменил 'dig -x' на' echo', чтобы получить требуемый ip); 1. Он печатает полную строку 'if' command 2.' cut {} 'no такой файл или каталог 3. нет вывода. – DarKnight

+0

Я не знаю, что ваша проблема с комбинацией 'awk' /' sh'; который работал для меня (это был тот, который был официально протестирован). Я переписал другие; раньше они не были достаточно волосатыми. Сейчас они работают, но я бы не рекомендовал их. Этот ответ предполагает, что вы используете оболочку Bash или Korn или некоторую другую разумно совместимую с POSIX оболочку. Он не будет работать с такими вещами, как DOS (Windows) 'cmd.exe' в качестве оболочки. –

+0

Первое решение имеет '! =' Которое должно быть '=='. – DarKnight

0
awk -F- '!/denied/ {print $6}' 

расколы каждый входной линии в полях, разделенных -, игнорирует строки, соответствующие denied и извлекает 6-е поле остальных линий. С вас пример выводит:

216.58.209.77:443 
46.28.247.89:443 
+0

Я пробовал 'tail -f nohup.out | awk -F- '!/denied/{print $ 6}' >> a.out ', но выходной файл пуст – DarKnight

+0

Попробуйте' awk -F- '!/denied/{print $ 6}' nohup.out', чтобы проверить, это похоже на то, что вы хотите. Если это так, то следующий шаг - понять влияние потока 'tail -f nohup.out' на' awk'. Вероятно, происходит, что 'awk' выполняет некоторую буферизацию, и вам придется ждать, пока буфер не будет сброшен, чтобы увидеть эффект. В зависимости от вашей версии 'awk' могут быть способы управления этой промывкой. С GNU Awk 4.1.1 API: 1.1 (GNU MPFR 3.1.2-p3, GNU MP 6.0.0), например, вы можете попробовать '{print $ 6; fflush();} '. Дайте нам знать. –

Смежные вопросы