Bir programın stdout'a yazdırdığı her yeni satırın önüne bir metin koyun


9

Bu yüzden biraz kayıt yapmak istiyorum ve bunun için bash betiğinin çıktısının önüne bir tarih koymak istiyorum. Sorun, birden fazla çıktı satırı olmasıdır. Yalnızca çıktıdan önce tarihi koyabiliyorum. Ama sonra günlüklerde tarih olmayan bir satır var. Tabii ki yukarıdaki satırdaki tarihin aynı olduğunu varsayabilirim, ama bir çözüm olmasını umuyordum. Şimdiden teşekkürler!

Bu benim başka bir komut dosyasını çağıran benim betiğim:

#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended

Bu çıktı:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended

Ve sahip olmak istediğim şu:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended

Sanırım sadece ikinci senaryoyu değiştirebilir misin?
jmetz

Hayır, maalesef değil. Bu yüzden buraya geldim.
tzippy

Yanıtlar:




2

Kullanabilirsiniz awk

./script.sh | awk '{ print d,$1}' "d=$(date "+%F %T")"

awkbir girdi akışı alır ve çıktısını değiştirir. Bu komut dosyası "baskı d ve ardından orijinal çıktı" diyor, ardından dtarihle dolduruluyor .


1
Bu, dateifadeyi yalnızca bir kez değerlendirmez , böylece tüm bu satırlar aynı anda yazdırılır mı?
Daniel Beck

@DanielBeck Evet - her seferinde tarihi aldığını varsaymıştım, ancak testimi yeterince hızlı bitirdim
Paul

1

Bu işlem, her çıktı satırından önceki geçerli tarih ve saati yazdıracaktır ./script.sh:

set -f
./script.sh | while read -r LINE; do echo $(date "+%F %T") : "$LINE"; done
set +f

Nasıl çalışır

  • set -fbash genişletmeyi kapatır (veya echo *gerçek bir yıldız işareti yazdırmaz).

  • while read -r LINE; do ... donebir çıktı satırını değişkene kaydeder $LINEve ...tüm satırlar işlenene kadar yürütür .

  • echo $ (tarih "+% F% T"): "$ LINE", satırı geçerli saat ve tarihle basar.

  • set +f bash genişletmeyi tekrar açar, böylece bash komut dosyanızın geri kalanına müdahale etmez.


Yalnızca bir kez değerlendirilir, bu nedenle her sedkomut, ikinci komut dosyasına başlamadan hemen önce aynı tarihi ekler. Kullanıcının istediği gibi değil ...
Daniel Beck

Bu girişimin de işe yarayacağını sanmıyorum. AFAIK, önce tüm alt kabuk tamamen değerlendirilir, daha sonra döngü geçer. Şimdi zamanlar infazdan sonra .
Daniel Beck

Örneğiniz çalışmaz, yalnızca çıktıyı geciktirdiğiniz için çalışmaz ls. Senaryonuzu aşağıdakilerle deneyin script.sh: #!/bin/bash(newline)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
Daniel Beck

For döngüsü yerine loop readile kullanın while.
chepner

@chepner: İyi fikir.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.