2015-10-11 7 views
1

Я пытаюсь вывести следующее выражение tcpdump grep в файл:Как вывести tcpdump с выражением grep в stdout/file?

tcpdump -vvvs 1024 -l -Tcp port 80 | grep -E 'X-Forwarded-For:' -line-buffered | awk '{print $ 2}

Я понимаю, что это связано с параметром, зависящим от строки, который отправляет вывод в stdin. Однако, если я не использую -line-buffered, я не получаю никакого вывода от моего tcpdump.

Как я могу использовать grep, чтобы он отправил мой вывод прямо в stdout/file в этом случае?

ответ

2

Я пытаюсь вывести следующее выражение ТСРйитр Grep в файл

Затем перенаправить вывод последней команды в конвейере к файлу:

tcpdump -vvvs 1024 -l -A tcp port 80 | grep -E 'X-Forwarded-For:' --line-buffered | awk '{print $2}' >file 

I понимаете, что это связано с параметром, зависящим от строки, который отправляет вывод в stdin.

Нет, это не с --line-buffered делает:

$ man grep 

    ... 

    --line-buffered 
      Force output to be line buffered. By default, output is line 
      buffered when standard output is a terminal and block buffered 
      otherwise. 

поэтому не меняется, когда вывод идет, он просто меняется, когда данные фактически записаны в выходной дескриптор, если это не терминал , Это не терминал в этом случае - это канал, поэтому по умолчанию он блокируется буфером, поэтому, если grep записывает 4 строки вывода, а это меньше, чем полный буферный блок (в этом случае буферные блоки обычно составляют 4 Кбайта в большинстве современных UN * Xes и Windows, поэтому вполне вероятно, что эти 4 строки не будут заполнять буфер), эти строки будут не немедленно будут записаны grep на трубу, поэтому они не появятся сразу.

--line-buffered изменяет это поведение, так что каждая строка записывается в трубу по мере ее создания, а awk видит ее раньше.

Вы используете -l с ТСРйитр, который имеет тот же эффект, по крайней мере, на ООН * X:

$ man tcpdump 

    ... 

     -l  Make stdout line buffered. Useful if you want to see the data 
       while capturing it. E.g., 

        tcpdump -l | tee dat 

       or 

        tcpdump -l > dat & tail -f dat 

       Note that on Windows,``line buffered'' means ``unbuffered'', so 
       that WinDump will write each character individually if -l is 
       specified. 

       -U is similar to -l in its behavior, but it will cause output to 
       be ``packet-buffered'', so that the output is written to stdout 
       at the end of each packet rather than at the end of each line; 
       this is buffered on all platforms, including Windows. 

Так трубопровод, как вы написали это, заставит Grep видеть каждую строку что tcpdump печатает, как только tcpdump печатает его, и вызывает awk, чтобы увидеть каждую из этих строк, которая содержит «X-Forwarded-For:», как только grep увидит это и сопоставит его.

Однако, если я не использую -line-buffered, я не получаю никакого вывода от моего tcpdump.

Вы увидите это в конце концов , до тех пор, как Grep производит ценность буфера вывода; однако это может занять очень много времени. --line-buffered заставляет grep записывать каждую строку по мере ее создания, поэтому она появляется, как только grep производит ее, а не заполняет буфер.

Как я могу использовать grep, чтобы он отправил мой вывод непосредственно в stdout/file в этом случае?

grep отправляет свой (стандартный) выход на awk, который, предположительно, вы хотите; вы извлекаете второе поле из вывода grep и печатаете только это.

Таким образом, вы не хотите Grep отправить его (стандартный) выход непосредственно на терминал или в файл, вы хотите, чтобы отправить свой вывод в AWK и имеют AWK отправить его (стандарт) выходной там. Если вы хотите, чтобы вывод печатался на вашем терминале, ваша команда делает правильные вещи; если вы хотите, чтобы он был отправлен в файл, перенаправите стандартный вывод awk в этот файл.

+0

Спасибо за разъяснение о --line-buffered. Однако моя команда ничего не выводит на файл, поэтому что-то определенно неправильно. Я могу видеть, что строки печатаются, если я не пытаюсь выполнить вывод в файл, но они не записываются в файл независимо от того, сколько данных отображается. То же самое происходит, если я удаляю -line-buffered – Rdang

+0

«Моя команда ничего не выводит на файл» Вы перенаправили стандартный вывод awk в файл? I.e. заканчивается ли ваша команда '> {filename}', где '{filename}' - это имя файла, на который вы хотите напечатать вскрытые пакеты? –

+0

Yea m8, я написал команду в своем посте: tcpdump -vvvs 1024 -l -A tcp port 80 | grep -E 'X-Forwarded-For:' -line-buffered | awk '{print $ 2}'> file – Rdang