Bash

管道 nc 到 sed 並評估每行的日期時間

  • April 8, 2021

有人可以提供任何想法,我如何將數據從 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='')

引用自:https://serverfault.com/questions/1059355