Bash
管道 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 的限制。有任何想法嗎?..
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='')