有人能提供任何想法吗,我怎样才能将数据从 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
Pipe 可能根本不是答案,但我有点受到 bash 的限制。有什么想法吗?
答案1
sed
无法在每次运行脚本时一遍又一遍地运行命令(当然,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 包装器,为其读取和打印的每一行添加时间戳……或者如果 C 太难,则使用 Python:
import sys
from datetime import datetime
for line in sys.stdin:
print('{0}\t{1}'.format(int(datetime.utcnow().timestamp()), line), end='')