Передача nc в sed и оценка даты и времени для каждой строки
Может ли кто-нибудь подсказать, как я могу передать данные из nc в sed (или awk или что-то еще), а также оценить и записать в файл временную метку после каждой строки? Что у меня есть:
# cat /etc/systemd/system/ncserver.service
[Unit]
Description=netcat listener
After=network.target
[Service]
Restart=always
RestartSec=1
ExecStart=/usr/bin/bash -c '/usr/bin/nc -n -v -l -k -p 1313 >> /opt/data/$(hostname)-$(date -u +%%y%%m%%d-%%H).txt'
[Install]
WantedBy=multi-user.target
простой прослушиватель - получает текст через необработанный TCP, отправляет в файл (перезапускается cron один раз в день для создания нового файла)
Я хочу добавить текущую временную метку к каждой строке поступающего текста (в начале или в конце строки, не имеет значения). Пробовал sed, awk, но проблема в том, что я не могу оценитьdate
для каждой строки — оценивается только один раз, при запуске службы. Выглядит так
109582 ? Ss 0:00 /usr/bin/bash -c /usr/bin/nc -n -v -l -k -p 1313 | /usr/bin/sed 's/^/'$(date +%s)
109583 ? S 0:00 /usr/bin/nc -n -v -l -k -p 1313
109584 ? S 0:00 /usr/bin/sed s/^/1617555467\;/g
Труба, возможно, вообще не ответ, но я ограничен bash. Есть идеи?..
2 ответа
не имеет возможности запускать команду снова и снова каждый раз, когда вы запускаете скрипт (ну, GNUsed
имеет/e
флаг, который делает это, но обычно он не переносим), поэтому вам, вероятно, следует переключиться на инструмент, который делает это.
ExecStart=/usr/bin/bash -c '/usr/bin/nc -n -v -l -k -p 1313 | awk "{ system(\"date +%s | tr \\047\\\\n\\047 \\047\\\\t\\047\") }1"
>> /opt/data/$(hostname)-$(date -u +%%y%%m%%d-%%H).txt'
Цитирование там достаточно неприятно, поэтому вы можете сохранить командную строку в отдельном скрипте и просто указать путь к ней в качестве аргументаExecStart
. Например, если вы сохранили это в/usr/local/bin/dump1313
#!/bin/sh
/usr/bin/nc -n -v -l -k -p 1313 |
awk '{ system("date +%s | tr \047\\n\047 \047\\t\047") }1' >> /opt/data/$(hostname)-$(date -u +%%y%%m%%d-%%H).txt
иchmod a+x
этот файл, вы можете просто поместить
ExecStart=/usr/local/bin/dump1313
(Здесь нет команд, специфичных для Bash, поэтому я поставил#!/bin/sh
вместо#!/usr/bin/bash
или что у тебя есть.)
Бегtr
чтобы избавиться от терминатора линии изdate
это все-таки скорее бородавка. Если вы хотите сделать это автономным и ресурсоэффективным, возможно, создайте простую оболочку C, которая добавляет отметку времени к каждой строке, которую она читает и печатает... или Python, если C слишком сложен:
import sys
from datetime import datetime
for line in sys.stdin:
print('{0}\t{1}'.format(int(datetime.utcnow().timestamp()), line), end='')
Я хочу добавить текущую временную метку к каждой строке поступающего текста (в начале или в конце строки, не имеет значения).
Это очень похоже на то, что делает системный журнал . Возможно, вы сможете заменитьnc
с чем-то вроде pysyslog и пусть он захватит текст в сокете и добавит дату.