AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1059355
Accepted
M.Ch.
M.Ch.
Asked: 2021-04-05 11:08:03 +0800 CST2021-04-05 11:08:03 +0800 CST 2021-04-05 11:08:03 +0800 CST

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

  • 772

有人可以提供任何想法,我如何将数据从 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 的限制。有任何想法吗?..

bash text pipe sed nc
  • 2 2 个回答
  • 240 Views

2 个回答

  • Voted
  1. gm3dmo
    2021-04-08T12:09:02+08:002021-04-08T12:09:02+08:00

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

    这听起来很像syslog所做的。您也许可以用pysyslognc之类的东西替换,并让它捕获套接字上的文本并附加日期。

    • 0
  2. Best Answer
    tripleee
    2021-04-08T23:46:15+08:002021-04-08T23:46:15+08:00

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

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve