Puncte:3

Capturați ieșirea scriptului pentru a adăuga data și ora la ieșire în timp real

drapel cn

Caut să capturez rezultatul execuției unui script shell în timp real pentru a o îmbogăți cu informații care oferă data și ora.

Pentru a ilustra, am de exemplu un scenariu de acest tip pe care eu nu trebuie modificate:

#!/bin/bash
pentru i în 2 3 1
do
  echo „Se așteaptă $i secunde...”
  dormi $i
Terminat

Scriptul produce următorul rezultat:

Așteptați 2 secunde...
Așteptați 3 secunde...
Așteptați 1 secundă...

Încerc să produc rezultatul de tipul:

2021-06-16 11:44:48 [INFO] Se așteaptă 2 secunde...
2021-06-16 11:44:50 [INFO] Se așteaptă 3 secunde...
2021-06-16 11:44:53 [INFO] Se așteaptă 1 secundă...

Folosesc următoarele funcții shell pentru formatare într-un script care rulează scriptul meu inițial:

jurnal de funcții {
   echo `data +%Y-%m-%d" "%H:%M:%S`" $@"
   if [ "$LOGFILE" != "" ]
   atunci
      echo `data +%Y-%m-%d" "%H:%M:%S`" $@" >>$LOGFILE
   fi
}

function loginf {
   log „[INFO] $@”
}

Mă descurc foarte bine cu o buclă while pe o citire pentru a captura rezultatul scriptului meu, dar primesc toate liniile în același timp (sfârșitul execuției sale) și, prin urmare, toate liniile au aceeași dată și oră. Încerc să obțin liniile de fiecare dată când scriptul produce o linie și nu la sfârșitul execuției.

pLumo avatar
drapel in
Cum numești scenariul tău inițial? Acest lucru funcționează bine pentru mine: `./script1.sh | în timp ce IFS= citește -r l; face loginf "$l"; terminat`. Vezi și https://serverfault.com/questions/72744/command-to-prepend-string-to-each-line
bac0n avatar
drapel cn
`./script.sh | este „%Y-%m-%d %H:%M:%S [INFO]”`
raj avatar
drapel cn
raj
Am creat un script care conține cele două funcții ale tale și apoi următorul cod: `while { read; } face loginf $REPLY; terminat`. Rulează `./script1 | ./script2` (unde `script1` este primul dvs. script și `script2` scriptul menționat mai sus) îmi oferă rezultate corecte, de exemplu. marcaje temporale diferite.
bac0n avatar
drapel cn
nu trebuie să folosiți `echo` într-adevăr, ar putea face doar `f(){ data „+%Y-%m-%d %H:%M:%S [INFO] $*”; }; f unu doi trei`
bac0n avatar
drapel cn
`f(){ printf '%(%Y-%m-%d %H:%M:%S)T [%s] %s\n' -1 INFO "$*"; }; f unu doi trei` chiar mai bine...
Puncte:2
drapel us

The ts comanda din pachet moreutils face exact ceea ce cauți:

./script.sh | ts

Are diverse opțiuni pentru formatarea marcajului de timp. De exemplu,

este „%F %T [INFO]”

vă va oferi formatul exact pe care îl utilizați în întrebarea dvs.

Puncte:0
drapel cn
vog

Puteți folosi fie ts:

./scriptul_dvs.sh | ts

De, dacă aveți nevoie de ceva portabil care funcționează pe sistemele în care ts nu este instalat, puteți face asta într-un mod simplu in timp ce buclă folosind sistemul încorporat citit comanda:

./scriptul_dvs.sh | în timp ce linia de citire; do echo "$(data +'%Y-%m-%d %H:%M:%S') [INFO] $line"; Terminat

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.