it-swarm.asia

Her satıra dize başlığını eklemeyi mi istiyorsunuz?

Böyle bir şey mi arıyorsunuz? Herhangi bir fikir?

cmd | prepend "[ERRORS] "

[ERROR] line1 text
[ERROR] line2 text
[ERROR] line3 text
... etc
37
user14645
cmd | while read line; do echo "[ERROR] $line"; done

yalnızca bash yerleşiklerini kullanma avantajına sahiptir, böylece daha az işlem oluşturulur/yok edilir, böylece gerekir awk veya sed'den daha hızlı bir dokunuş olabilir.

@tzrik, Nice bash işlevini de yapabileceğini belirtiyor. Gibi tanımlamak:

function prepend() { while read line; do echo "${1}${line}"; done; }

aşağıdaki gibi kullanılmasına izin verir:

cmd | prepend "[ERROR] "
40
pjz

Bunu dene:

cmd | awk '{print "[ERROR] " $0}'

Şerefe

46
Ilya Zakreuski

@Grawity'ye gereken tüm krediyle, yorumunu bir cevap olarak gönderiyorum, burada bana en iyi cevap gibi görünüyor.

sed 's/^/[ERROR] /' cmd
13
Eric Wilson

Bazı hız testleri yapmak için GitHub depos oluşturdum.

Sonuç:

  • Genel durumda, awk en hızlısıdır. sed biraz daha yavaş ve Perlsed 'den çok daha yavaş değil. Görünüşe göre, tüm bunlar metin işleme için son derece optimize edilmiş dillerdir.
  • Çatalların hakim olduğu çok özel durumlarda, komut dosyanızı derlenmiş ksh komut dosyası (shcomp) olarak çalıştırmak daha fazla işlem süresi kazandırabilir. Bunun aksine, bash derlenmiş ksh komut dosyalarına kıyasla yavaştır.
  • awk'ı yenmek için statik olarak bağlı bir ikili dosya oluşturmak çabaya değmez.

Buna karşılık python yavaş öldü, ancak derlenmiş bir durumu test etmedim, çünkü genellikle böyle bir komut dosyası durumunda yapacağınız şey bu değildir.

Aşağıdaki varyantlar test edilir:

while read line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST]" $line; done
while read -r line; do echo "[TEST]" "$line"; done
sed 's/^/[TEST] /'
awk '{ print "[TEST] " $0 }'
awk -vT="[TEST] " '{ print T $0 }'
awk -vT="[TEST]" '{ print T " " $0 }'
awk -vT="[TEST]" 'BEGIN { T=T " "; } { print T $0 }'
T="[TEST] " awk '{ print ENVIRON["T"] $0 }'
T="[TEST]" awk '{ print ENVIRON["T"] " " $0 }'
T="[TEST]" awk 'BEGIN { T=ENVIRON["T"] " " } { print T $0 }'
Perl -ne 'print "[TEST] $_"'

Aletlerimden birinin iki ikili varyantı (yine de hız için optimize edilmedi):

./unbuffered.dynamic -cp'[TEST] ' -q ''
./unbuffered.static -cp'[TEST] ' -q ''

Python arabelleğe alındı:

python -uSc 'import sys
for line in sys.stdin: print "[TEST]",line,'

Ve Python arabelleksiz:

python -uSc 'import sys
while 1:
 line = sys.stdin.readline()
 if not line: break
 print "[TEST]",line,'
8
Tino
cmd | sed 's/.*/[ERROR] &/'

Stdout ve stderr'i işleyen bir çözüm istedim, bu yüzden prepend.sh Yazdım ve yoluma koydum:

#!/bin/bash

prepend_lines(){
  local prepended=$1
  while read line; do
    echo "$prepended" "$line"
  done
}

tag=$1

shift

"[email protected]" > >(prepend_lines "$tag") 2> >(prepend_lines "$tag" 1>&2)

Şimdi cmd çıkışına "[ERROR]" başlığını eklemek için prepend.sh "[ERROR]" cmd ... Komutunu çalıştırabilirim ve yine de stderr ve stdout ayrı olabilir.

4
Aprotim
cmd | xargs -l 1 -i echo "prefix{}"

veya prefix satırın kendisinden boşlukla ayrılmışsa daha da kolay

cmd | xargs -l 1 echo prefix

Bu, performans açısından çok verimli değil, yazmak için kısa.

Her girdi satırı için echo çalıştırarak çalışır. xargs ayrıca \0- sınırlandırılmış çizgiler.

0
scorpp