2016-04-07 27 views
2

Linux'ta pek iyi değilim. Böylegrep çıktısını CSV olarak biçimlendirin

svn info -R https://SOME_URL/TEST | grep 'Ruta: \|Fecha de último cambio: ' 

çıkış alıyorum görünüyor: Bazı verileri bulmak için bir sonraki komutu kullanıyorum

Ruta: TEST 
Fecha de último cambio: 2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016) 
Ruta: PRUEBA1.txt 
Fecha de último cambio: 2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016) 
Ruta: PRUEBA2.txt 
Fecha de último cambio: 2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016) 

Ama bir rapor sunmaları gereklidir yüzden çıkış görmek istiyorum CSV belgesine benzer bir şey gibi:

"Ruta";"Fecha" 
"TEST";"2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)" 
"PRUEBA1.txt";"2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)" 
"PRUEBA2.txt";"2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)" 

Bunu yalnızca linux komutlarıyla yapmak mümkün müdür? Teşekkürler!

+0

Eğer sed' 'aşina mısınız başka awk ? – usr2564301

+0

Hayır, ama –

+2

'awk' için daha faydalı olabileceğini düşünürseniz arayacağım. – Barmar

cevap

2

bu iş için doğru aracı awk olduğunu ve awk kullandığınız zaman grep gerekmez:

$ cat tst.awk 
NR==1 { fmt="\"%s\";\"%s\"\n"; printf fmt, "Ruta", "Fecha" } 
sub(/^Ruta: /,"") { ruta=$0 } 
sub(/^Fecha de último cambio: /,"") { printf fmt, ruta, $0 } 

$ svn info -R https://SOME_URL/TEST | awk -f tst.awk 
"Ruta";"Fecha" 
"TEST";"2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)" 
"PRUEBA1.txt";"2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)" 
"PRUEBA2.txt";"2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)" 
+1

Teşekkürler Çok @ @ –

2

Kolayca yapılabilecek pek çok yol vardır. Kabuğunuzu (herhangi bir modern kabuk parametresi genişletme ve altyazı çıkarma) kullanabilir veya sed veya awk veya bunların herhangi bir kombinasyonunu kullanabilirsiniz.

Kabuğu belirtmediniz, ancak POSIX uyumlu bir kabuğunuz olduğu sürece, kısa bir komut dosyası svn komutunuzun sonuçlarını oldukça kolay bir şekilde işleyebilir/ayrıştırabilir.

$ cat dat/ruta.txt 
Ruta: TEST 
Fecha de último cambio: 2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016) 
Ruta: PRUEBA1.txt 
Fecha de último cambio: 2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016) 
Ruta: PRUEBA2.txt 
Fecha de último cambio: 2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016) 

Kullanım/Çıktı

$ cat dat/ruta.txt | bash parseruta.sh 
Ruta;Fecha 
TEST;2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016) 
PRUEBA1.txt;2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016) 
PRUEBA2.txt;2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016) 

sizin komut ile kullanmak için

#!/bin/bash 

fname="${1:-/dev/stdin}" ## read from given filename or stdin (default) 

echo "Ruta;Fecha"  ## print heading 

while read -r line; do ## for each line of input 
    [ "${line%%:*}" = "Ruta" ] && echo -n "${line##* }" ## begins 'Ruta' 
    [ "${line%%:*}" = "Fecha de último cambio" ] && { ## begins "Fecha.." 
     tmp="${line#*:}" 
     echo ";${tmp:1}" 
    } 
done < "$fname" 

giriş dosyasında: Aşağıdaki bash kullanır, ancak parametre genişletme herhangi POSIX kabuğunda çalışacak (Script'i chmod 0755 scriptname ile çalıştırdıktan sonra) aşağıdakileri yapabilirsiniz:

svn info -R https://SOME_URL/TEST | \ 
grep 'Ruta: \|Fecha de último cambio: ' | \ 
scriptname 

Bir deneyin ve sorularınız varsa bana bildirin (yani tamamı tek satır sonunda '\' continuations yukarıda çizgidir).

Bir POSIX kabuğuna (veya ${var:start:end} biçiminde dize dizin oluşturmasız bir kabukla) sınırlanıyorsanız, değişmesi gereken bir komut vardır. POSIX farklı bir şekilde dize endeksleme kolları, böylece değiştirmek gerekir:

echo ";${tmp:1}" 

echo $(expr substr "$tmp" 2 $(expr length "$tmp")) 

amacıyla endekse 2 karakterinden tarihinden başlayarak alt dize "Fecha..." bölümünü çıkardıktan sonra .

1

alternatif

$ awk -v q='"' 'NR==1{print q "Ruta" q ";" q "Fecha" q} 
      /^Ruta:/{t=q $2 q; next} 
        {sub(/[^:]+: /,""); 
         print t ";" q $0 q}' file 

"Ruta";"Fecha" 
"TEST";"2016-04-07 15:52:40 -0500 (jue 07 de abr de 2016)" 
"PRUEBA1.txt";"2016-04-07 15:16:19 -0500 (jue 07 de abr de 2016)" 
"PRUEBA2.txt";"2016-04-07 15:15:47 -0500 (jue 07 de abr de 2016)" 
+0

Teşekkürler! Zaten test ettim ve benim için mükemmel çalıştı, teşekkürler! Awk öğrenmeye başlayacağım, çok fazla rapor yapmama yardımcı olacak –