2012-04-11 11 views
0

Ich habe ein Programm, das Text an stdout sendet. Aber ich möchte nur jene Zeilen behalten, wo die fünfte Spalte nicht '*' ist. Das ist der Stern-Char, nicht der Regex-Ausdruck, der alles fängt. Ich kann nicht entkommen zu verwenden für diese scheinen, habe ich versucht,nur Zeilen mit spezifischer Spalte nicht drucken *

./a.out |awk '$5!=* {print}' 
awk: $5!=* {print} 
awk: ^syntax error 
./a.out |awk '$5!=\* {print}' 
awk: $5!=\* {print} 
awk: ^backslash not last character on line 

Awk ist natürlich keine Voraussetzung, aber ich dachte, dies die einfachste wäre.

Dank

Antwort

4

awk ähnlich ist zu den meisten Algol/C-Familie Sprachen; Literale Strings erfordern String-Anführungszeichen.

awk '$5 != "*" {print}' 
+2

Da die Standardaktion für 'awk' zu drucken, können Sie einfach schreiben:' awk ‚$ 5 =‚*‘' Dateiname – JRFerguson

+0

Sie brauchen nicht die Druckbefehl, es ist der Standard in awk: 'awk '$ 5! =" * "''. – jfg956

2

Versuchen Sie folgendes:

awk '$5!="*"{print}' 
1

In Perl:

perl -ane 'print unless $F[4] eq q(*)' file 

Der -n Schalter wickelt diese Schleife aaround Ihr Skript das Argument Dateiname (n) auf der Kommandozeile zu lesen:

LINE: 
while (<>) { 
    ... # your script here 
} 

Die -a Arms ein Autosplit der Zeile (in Whitespace) in einem vordefinierten Array namens @F. Unlike awk $ F [0] ist das erste Feld nur.

Das -e Argument ist einfach Ihr Skript.

+0

Der Schalter '-n' fügt diese Schleife um Ihr Skript ein, um einen oder mehrere Dateinamenargumente zu lesen: – JRFerguson

-1

Dies könnte für Sie arbeiten:

awk '$5 !~ /^[*]$/' file 
+0

-1. Sinnlose Verwendung von Regex für einen festen String-Vergleich. – Kaz

+0

@kaz die Absicht war zu zeigen, dass das '*' als Klassenzeichen 0quoted gezeigt werden könnte – potong

+0

Es ist kaum unquoted. Es ist in [] eingewickelt, was in^$ eingeschlossen ist, das in // eingeschlossen ist. – Kaz

Verwandte Themen