LINUX.ORG.RU

скриптование netcat

 , ,


0

1

Через nc принимаю строчный ввод, строчки прибегают двух типов, скажем, просто пинг и инфа. Можно ли обойтись без временных файлов, дабы фильтрануть строчки (пинг не нужен, из инфы только одно слово) сразу на ходу? Требуется просто выводить это «слово» и общее количество принятых «слов».

пока я просто гляжу так: nc xxx.xxx.xxx.xxx yyyyy | cut -f9

% echo 1|netcat grey 80|perl -wnE '$w+=scalar(split /\s+/);print "$w $_"'
4 HTTP/1.1 400 Bad Request
6 Server: nginx
13 Date: Wed, 11 Feb 2015 08:18:01 GMT
disarmer ★★★
()
Ответ на: комментарий от disarmer

спасибо за элегантное решение Еще вопрос возник. Если в трубу втыкаю cut, вывод «вылетает в трубу», пардон за каламбур. ЧЯДНТ?

netcat 172.41.1.65 33001  | cut -f9 | perl -wnE '$w+=scalar(0);print "$w $_"'

semenaa
() автор топика
Ответ на: комментарий от disarmer

да пропадает. Может быть, cut как-то ограниченно работает с потоками? В мане и info написано, мол, файлы жует в основном.

Ща попробовал еще grep воткнуть перед cut, тож ничего не выдает:

$ netcat 172.41.1.65 33001 | grep "@" | cut -f9

...и глухо. Без грепа - нормально. Греп без ката - тоже. Прям не знаю. В сыром виде в инпуте присутствует \n\r, но это наверно обрезается катом, п.что поле, которое он достает, не последнее.

semenaa
() автор топика
Ответ на: комментарий от semenaa

Буферизация видимо, накапливает данные. Если нужно сразу видеть вывод, то фильтр можно записать так:

... | perl -wnE '$|=1;$w+=scalar(split /\s+/);print "$w $_"'
Но если сюда вставить cut, то он скорее всего тоже будет буферизовывать. Поэтому можно вырезать девятое поле сразу в perl:
... | perl -wnE '$|=1;@_=split "\t",$_;$w+=scalar(split /\s+/,$_[8]);print "$w $_"'

disarmer ★★★
()
Ответ на: комментарий от disarmer

Спасибо за наводку. Поковырявшись в синтаксисе перла, добавил отсебятины в твой скрипт, и пользуюсь. Спасибо еще раз!

semenaa
() автор топика
Ответ на: комментарий от semenaa

Похоже, кстати, греп и кат ждали EOF, поэтому я и вывода в файл не видел (при выводе в stdout), и в stderr (пробовал конвейер |& ) всю дорогу пусто было. Надо внести окончательную ясность, еще поштудирую литературу. Вопрос закрыт.

semenaa
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.