簡體   English   中英

如何在將標准輸出重定向到 Bash 中的文件時添加時間戳?

[英]How to add timestamp while redirecting stdout to file in Bash?

我有一個程序(服務器),我正在尋找一種方法(腳本),將其所有stdout重定向(或更好地復制)到文件並為每個條目添加時間戳。

我做了一些研究,我能得到的最遠的結果是感謝How to add timestamp to STDERR redirection 它重定向stdout但添加的時間戳是腳本完成的時間:

#!/bin/bash
./server | ./predate.sh > log.txt

predate.sh代碼:

#!/bin/bash
while read line ; do
    echo "$(date): ${line}"
done

似乎服務器輸出在程序退出后被刷新。(沒有重定向它工作正常)。 此外,如果我嘗試在提到的線程中的給定示例上使用predate.sh ,它可以完美運行。 我知道向主程序添加時間戳很容易,但我寧願避免編輯其代碼。

我最近正好需要:在串行控制台 (picocom) 中接收日志消息,將它們打印到終端和文件,並在前面加上日期。

我現在使用的看起來很糟糕。 像這樣:

picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt
  • picocom的輸出通過管道傳輸到awk
  • awk在日期之前添加( %s選項將時間轉換為自 1970-01-01 00:00:00 UTC 以來的秒數- 或使用%c為人類可讀的格式)
  • fflush() 刷新awk 任何緩沖輸出
  • 它通過管道傳輸到tee ,將其轉移到一個文件中。 (你可以在這里找到一些關於tee東西)

moreutils ts

絕對日期和時間是默認值:

$ sudo apt-get install moreutils
$ (echo a;sleep 1;echo b;sleep 3;echo c;sleep 2;echo d;sleep 1) | ts | tee myfile
$ cat myfile
Apr 13 03:10:44 a
Apr 13 03:10:45 b
Apr 13 03:10:48 c
Apr 13 03:10:50 d

或從程序開始計數ts -s

$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -s
00:00:00 a
00:00:01 b
00:00:04 c
00:00:06 d    

或使用ts -i進行基准測試的增量:

$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i
00:00:00 a
00:00:01 b
00:00:03 c
00:00:02 d
$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i '%.s'
0.000010 a
0.983308 b
3.001129 c
2.001120 d

另請參閱: 如何監視每行 stdout 是 Bash 中用於基准測試的最后輸出行的時間?

在 Ubuntu 18.04、moreutils 0.60 上測試。

對我而言,您的代碼運行良好

檢查這是我嘗試過的

測試文件

#!/bin/bash

while true; do
  echo "hello"
done

早於.sh

#!/bin/bash

while read line; do
  echo $(date) ":" $line;    
done

然后

./test.sh  | ./predate.sh

給我

Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello

這可以使用“>”或“>>”進行附加重定向到某個文件

檢查快照

同樣,使用moreutils ts ,您只需在腳本頂部使用 exec 即可。

#!/bin/bash

exec > >(ts>>file.log)

echo hello 1
echo hello 2
sleep 5
echo hello 3

如果我理解您的問題是在 log.txt 文件中包含 stderr 輸出。 對 ? 如果那是您想要的解決方案是:

./服務器 2>&1 | ./predate.sh > log.txt

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM