2017-02-17 12 views
2

Ich muss zwei Parameter aus jeder Zeile eines Svn-Logs extrahieren, aber ich kann es nicht mit Grep tun.Bash Teilstring mehrere Parameter

Mein Svn Log-Befehl, wie

svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ | grep "^r[0-9]\+ | " | cut -c2- 

Gibt das Ergebnis in diesem Format:

318150 | lehors | 2002-01-28 20:48:11 +0100 (Mon, 28 Jan 2002) | 2 lines 
318149 | elena | 2002-01-28 20:46:33 +0100 (Mon, 28 Jan 2002) | 12 lines 
318148 | lehors | 2002-01-28 20:33:36 +0100 (Mon, 28 Jan 2002) | 2 lines 
318147 | lehors | 2002-01-28 20:22:51 +0100 (Mon, 28 Jan 2002) | 2 lines 

Wie kann ich die Versionsnummer (erster Parameter) und das Datum in diesem Format grep?

318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28 

Antwort

2

Verwenden Sie eine robustere für dieses Muster-Match/extrahieren von einzelnen Spalten.

.. | awk 'BEGIN{FS="|"}{split($3,temp, " "); print $1,temp[1]}' 
318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28 

Der .. | Teil stellt den Befehl aufgenommen werden, der die erforderliche Ausgangssignal erzeugt, das Rohr ausgekleideten ist Awk

Die Logik ist ziemlich geradlinig, geteilte Eingangsleitungen mit de-Begrenzers als | die erfolgt durch FS="|". Jetzt $1 stellt das erste Feld, das Sie wollen, und für den zweiten Teil teilen Sie den Teil $3 und verwenden Sie die split() Funktion auf Trennzeichen, ein Leerraum-Zeichen teilen und speichern Sie es in Array temp, so dass es als temp[1] zugegriffen werden kann, die anderen Raumfelder sind in dem Array von dem nächsten Index auf Stationen vorhanden.

So ideal denke, ich sollte es sein,

svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ | \ 
    awk 'BEGIN{FS="|"}{split($3,temp, " "); print $1,temp[2]}' 

Alternativ Sie GNU grep mit seinen -E erweiterten regulären Ausdruck Fähigkeiten nutzen könnten, aber es ist einfach nicht gut genug, um die entsprechenden Einträge auf derselben Linie zu zeigen, wie

grep -oE '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}' file 

(und)

grep -oE '^[[:digit:]]{6}' file 

aber nicht zusammen, wie ich die -o Flagge verwendet habe, um nur den Teil des Spiels zu drucken.

+1

realisiert Gerade do-, dass dies die Zeit gedruckt werden und OP will das Datum, Temperatur so zu ändern [2] durch Temp [1] wird es tun :) –

+0

@ZumodeVidrio: aktualisiert, dank ! – Inian

+0

Vielen Dank. Diese Lösung funktioniert tadellos – Botacco

1

Als Ihre Datei von einem Leerzeichen getrennt wird, und Sie wollen die ersten und fünften Spalten haben, ist dies eine weitere Lösung von cut mit:

cut -d' ' -f1,5 < svn_log_output_file 

(oder kochend cut -d' ' -f1,5 auf Ihren Befehl)

+1

Sie könnten auch Prozessersetzung als, schneiden -d '' -f1,5 <<(svn log http://svn.apache.org/repos/asf/xerces/java/trunk/) tun ' – Inian

1

Ein viel einfacherer Ansatz mit mehreren delimiters-

awk -F '[| ]' '{print $1, $7}' file 

Wo file die Ausgabe enthält, die Sie in Ihnen gezeigt, Frage.

Output-

318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28 

Natürlich brauchen Sie nicht in einer Zwischendatei zu speichern.Sie können

svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ \ 
| grep "^r[0-9]\+ | " | cut -c2- | \ 
awk -F '[| ]' '{print $1, $7}' 
0
awk '{print $1,$5}' file 

318150 2002-01-28 
318149 2002-01-28 
318148 2002-01-28 
318147 2002-01-28