Po pierwsze, jeśli oczekujesz, że te znaczniki czasu będą faktycznie reprezentować zdarzenie, pamiętaj, że ponieważ wiele programów wykonuje buforowanie linii (niektóre bardziej agresywnie niż inne), ważne jest, aby myśleć o tym tak blisko czasu, jaki miałby oryginalny wiersz został wydrukowany, a nie znacznik czasu akcji.
Możesz także sprawdzić, czy twoje polecenie nie ma jeszcze wbudowanej funkcji dedykowanej do tego. Na przykład ping -D
istnieje w niektórych ping
wersjach i wypisuje czas od epoki Uniksa przed każdą linią. Jeśli twoje polecenie nie zawiera własnej metody, istnieje kilka metod i narzędzi, które można zastosować, między innymi:
Powłoka POSIX
Pamiętaj, że ponieważ wiele powłok wewnętrznie zapisuje swoje łańcuchy jako łańcuchy, jeśli dane wejściowe zawierają znak null ( \0
), może to spowodować przedwczesne zakończenie linii.
command | while IFS= read -r line; do printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done
GNU awk
command | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'
Perl
command | perl -pe 'use POSIX strftime; print strftime "[%Y-%m-%d %H:%M:%S] ", localtime'
Pyton
command | python -c 'import sys,time;sys.stdout.write("".join(( " ".join((time.strftime("[%Y-%m-%d %H:%M:%S]", time.localtime()), line)) for line in sys.stdin )))'
Rubin
command | ruby -pe 'print Time.now.strftime("[%Y-%m-%d %H:%M:%S] ")'