2017-04-25 8 views
2

Ich versuche, eine Protokolldatei zu analysieren, die Zeilen wie diese haben: Bash umfassen Zeichenfolge zwischen Zeichen in awk Druck

aaa bbb ccc: [DDD] efg oi  
aaa bbb ccc: lll [DDD] efg oo  
aaa bbb ccc: [DDD] 

wo [DDD] kann an jedem Ort sein in Linie.

Nur eine Sache zwischen [ und ] in einem beliebigen Zeile

Mit awk und Raum als Trennzeichen sein, wie kann ich 1. drucken, 3. und alle Daten (gesamte Zeichenfolge) zwischen [ und ]?

Erwartete Ausgabe: aaa ccc: DDD

+2

haben, was Sie versucht haben, und wie es tat Scheitern? Es scheint, als ob Sie in der Lage sein sollten, dies zu lösen, indem Sie ungefähr die Hälfte der ersten Seite einer Awk-Einführung lesen. – tripleee

+0

'awk '{print $ 1, $ 3, $ 4}' Datei' – RomanPerekhrest

+0

' awk '{print $ 1, $ 3, ???}' ', um Daten bei bestimmten Positionen zu drucken, aber ich bitte um Hilfe beim Einschließen von Daten zwischen Zeichen, die an irgendeiner Stelle in der Schnur sein können. –

Antwort

3

gaffen (GNU awk) Ansatz:

Lassen Sie uns sagen, dass wir eine Datei mit der folgenden Zeile:

aaa bbb ccc: ddd [fff] ggg hhh 

Der Befehl:

awk '{match($0,/\[([^]]+)\]/, a); print $1,$3,a[1]}' file 

Der Ausgang:

aaa ccc: fff 

Spiel (string, regexp [, array])
Suche Zeichenfolge für die längste, am weitesten links durch den regulären Ausdruck abgestimmte substring regexp und gibt die Zeichenposition (Index) zurück, mit der der Teilstring beginnt (eins, wenn er am be beginnt Entkörnung von String). Wenn keine Übereinstimmung gefunden wird, kehren Null ..

+0

Daten, die zwischen "[" und "]" liegen, müssen nicht auf der 4. Position –

+1

$ 1 und sein $ 3 sind Pflichtfelder? Wenn sich Daten zwischen '[' '' '' '' '' '} befinden, können mehrere Einträge wie' aaa bbb ccc: ddd [fff] ggg hhh [jjj] '? – RomanPerekhrest

+0

Nur ein Eintrag zwischen '[' und ']' $ und $ 3 sind obligatorisch –

1

Gegeben:

$ cat file 
aaa bbb ccc: [DDD] efg oi  
aaa bbb [ccc:] lll DDD efg oo  
aaa [bbb] ccc: DDD 

(note - änderte sich von dem Beispiel des OP)

In POSIX awk:

awk 'BEGIN{fields[1]; fields[3]} 
           {s="" 
           for (i=1;i<=NF;i++) 
             if ($i~/^\[/ || i in fields) 
              s=i>1 ? s OFS $i : $i 
           gsub(/\[|\]/,"",s) 
           print s 
           }' file 

Drucke:

aaa ccc: DDD 
aaa ccc: 
aaa bbb ccc: 

Das Feld wird nicht zweimal ausgedruckt, wenn es in [] und im ausgewählten fields Array eingeschlossen ist. (d.h., [aaa] bbb ccc: nicht gedruckt aaa zweimal) Es wird auch in richtigen Feld, um zu drucken, wenn Sie aaa [bbb] ccc ...

-1
awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file 

oder

awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file 

aaa ccc: DDD 
+0

Ich würde gerne wissen, was los ist? –

+0

nicht sicher, aber Code-only-Antworten sind in der Regel verpönt. –

Verwandte Themen