LINUX.ORG.RU
решено ФорумAdmin

netcat и sed

 ,


0

1

Стоит задача. В порт 8698 каждые десять секунд приходит сообщение вида «uuu000 00». Нужно записывать это в файл и добавлять время получения сообщения.

Делаю

netcat -ul -p8698

Сообщения выводятся в консоль, как и должны.

Делаю

netcat -ul -p8698 > 1.txt

В файл запиывается куча лишнего шума. http://i.gyazo.com/e9726f8a5b3145a8ab40bee15e58926d.png При этом file -i выдает charset=binary Окей с помощью sed удаляю 00, 12 и 14 из файла. Charset становится ASKII, мусор исчезает.

Отлично. Перенаправляю вывод netcat на sed

netcat -ul -p8698 | sed 's/\x0//g' | sed 's/\x14//g' | sed 's/\x12//g' > cleared.txt

И в файле пустота. Где я проиграл? И почему при выводе на консоль он не выводит весь мусор?


#!/bin/bash

function data() {
echo -en '\x00\x00\x00\x14\x00\x75\x00\x6b\x00\x72\x00\x38\x00\x30\x00\x32'
echo -en '\x00\x20\x00\x31\x00\x38\x00\x31\x00\x00\x00\x14\x00\x75\x00\x6b'
}

data | iconv -f utf-16be -t utf-8 | sed 's/[\x0\x14]//g'
anonymous
()
sed 's/\x0//g' | sed 's/\x14//g' | sed 's/\x12//g' 

Команды sed можно указывать через точку с запятой

sed 's/\x0//g;s/\x14//g;s/\x12//g'

И в файле пустота. Где я проиграл?

sed работает с текстом построчно. Пока не пришёл конец строки, sed не будет эту строку обрабатывать

В файл запиывается куча лишнего шума

есть подозрение, что текст приходит не в ascii, а в полноценном двухбайтовом юникоде ( ucs2 )

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

Построчно sed начинает работать с ключём ″-u″, а так у него стандатная потоковая буферизация (setvbuf()), которая построчная для вывода в консоль, а в файл около 4 кбайт.

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

Спасибо, теперь понятно. Теперь вот только что-то не могу придумать, как в конце сообщения добавить перенос строки :\

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

Нет, не фиксированна. В любом случае уже решил все с помощью Си.

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