2011-01-17 11 views
0

Zum Beispiel, wenn ich eine Datei mit grep gemacht, die mir nächstes Ergebnis geben:Wie caraces wie(), '* [] aus einem Grep-Ergebnis mit grep, awk oder sed entfernen?

16 Jan 07:18:42 (name1), xx.210.49.xx), 
16 Jan 07:19:14 (name2), xx.210.xx.24), 
16 Jan 07:19:17 (name3), xx.140.xxx.79), 
16 Jan 07:19:44 (name4), xx.210.49.xx), 
16 Jan 07:19:56 (name5), xx.140.xxx.79), 

, dann, wie awk oder grep sed alle außer Datum Namen und IP zu entfernen wie folgt aussehen:

16 Jan 07:18:42 name1 xx.210.49.xx 
16 Jan 07:19:14 name2 xx.210.xx.24 
16 Jan 07:19:17 name3 xx.140.xxx.79 
16 Jan 07:19:44 name4 xx.210.49.xx 
16 Jan 07:19:56 name5 xx.140.xxx.79 

Mein grep Befehl wie folgt aussehen:

grep 'double' $DAEMON | awk -F" " '{print $2" "$1" "$3" "$8" "$10}' > $DBLOG 

Thx.

+0

\ Ihr Freund –

+0

Wenn Sie nicht zu manipulieren Felder wurden, sed wäre definitiv der einfache Weg zu gehen. 'sed -n '/ double/s/foo/bar/p' ' druckt alle Zeilen aus '' mit 'double' und' foo' in 'bar'. – Cascabel

+0

Es ist normalerweise nicht notwendig, das Feldtrennzeichen auf ein Leerzeichen zu setzen, da dies standardmäßig eingeschlossen ist. Sie können 'awk '{print $ 2, $ 1, $ 3, $ 8, $ 10}'' plus die anderen Dinge wie '/ double /' und 'gsub()' hinzufügen. –

Antwort

1

können Sie es mit nur einem awk Befehl tun. keine Notwendigkeit grep

awk '/double/{gsub("[(),]","",$8); gsub("[(),]","",$10);print $2" "$1" "$3" "$8" "$10}' 

oder nur

awk '/double/{gsub("[(),]","");print $2" "$1" "$3" "$8" "$10}' 

verwenden, wenn Sie auch [] entfernen müssen, dann dieses Muster verwenden: gsub("[][(),]","")

+0

Was zu sagen, außer DANKE für Experten! :) – easyyu

1

Breaking down ghostdog74 Antwort:

awk ' 
    /double/ { 
     gsub(/[(),\[\]]/, "") 
     print $2" "$1" "$3" "$8" "$10 
    } 
' 

/double/ erzählt awk, um das Zeug nur in { } für Linien durchzuführen, die double enthalten (/double/ ist ein regulärer Ausdruck).

gsub erwartet, dass das erste Argument ein regulärer Ausdruck, das zweite Argument eine Substitutionszeichenfolge und das dritte Argument die Variable ist, für die die Substitution ausgeführt wird. Wenn das dritte Argument nicht angegeben ist (wie in diesem Fall), wird standardmäßig $0 verwendet, was der gesamten Zeile entspricht.

Ich habe \[ und \] zu dem regulären Ausdruck, die [ und ] Zeichen zusätzlich zu (, ) und , übereinstimmen sollte.

In der Regel, wenn Sie sich die Kombination von awk, sed oder grep finden, gibt es fast immer einen Weg zu tun, was Sie mit nur sed oder nur awk benötigen.

+1

müssen nicht entkommen, wenn Sie dies tun: 'gsub (" [] [(),] "," ")' – ghostdog74

1

Mit sed

$> cat ./text | sed -r -e 's/(\(|\)\,)//g' 
16 Jan 07:18:42 name1 xx.210.49.xx 
16 Jan 07:19:14 name2 xx.210.xx.24 
16 Jan 07:19:17 name3 xx.140.xxx.79 
16 Jan 07:19:44 name4 xx.210.49.xx 
16 Jan 07:19:56 name5 xx.140.xxx.79 

Inb4 UselesUseOfCat: cat ./text hier ist ähnlich für grep Ausgang des OP.

3

Wenn Sie nur bestimmte Zeichen strippen, könnte man mit der -d Option am tr Befehl aussehen soll:

$ echo "16 Jan 07:18:42 (name1), xx.210.49.xx)," | tr -d "(),*'[]" 
16 Jan 07:18:42 name1 xx.210.49.xx 
1
[[email protected]~/temp] cat file1 
16 Jan 07:18:42 (name1), xx.210.49.xx), 
16 Jan 07:19:14 (name2), xx.210.xx.24), 
16 Jan 07:19:17 (name3), xx.140.xxx.79), 
16 Jan 07:19:44 (name4), xx.210.49.xx), 
16 Jan 07:19:56 (name5), xx.140.xxx.79), 

[[email protected]~/temp] sed 's/\(.*[^(]\)(\(.*\)),\(.*\)),/\1\2\3/g' file1 
16 Jan 07:18:42 name1 xx.210.49.xx 
16 Jan 07:19:14 name2 xx.210.xx.24 
16 Jan 07:19:17 name3 xx.140.xxx.79 
16 Jan 07:19:44 name4 xx.210.49.xx 
16 Jan 07:19:56 name5 xx.140.xxx.79 
Verwandte Themen