Передача 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 и пусть он захватит текст в сокете и добавит дату.

Другие вопросы по тегам