将 nc 管道传输到 sed 并评估每行的日期时间

将 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

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='')

答案2

我想将当前时间戳附加到每一行文本(在行的开头或结尾,无所谓)。

这听起来很像系统日志确实如此。你可以用nc类似pysyslog并让它捕获套接字上的文本并附加日期。

相关内容