Я пытаюсь вывести следующее выражение ТСРйитр 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 в этот файл.
Спасибо за разъяснение о --line-buffered. Однако моя команда ничего не выводит на файл, поэтому что-то определенно неправильно. Я могу видеть, что строки печатаются, если я не пытаюсь выполнить вывод в файл, но они не записываются в файл независимо от того, сколько данных отображается. То же самое происходит, если я удаляю -line-buffered – Rdang
«Моя команда ничего не выводит на файл» Вы перенаправили стандартный вывод awk в файл? I.e. заканчивается ли ваша команда '> {filename}', где '{filename}' - это имя файла, на который вы хотите напечатать вскрытые пакеты? –
Yea m8, я написал команду в своем посте: tcpdump -vvvs 1024 -l -A tcp port 80 | grep -E 'X-Forwarded-For:' -line-buffered | awk '{print $ 2}'> file – Rdang