2010-12-07 4 views
1

Lassen Sie uns sagen, dass ich eine Datei, die wie folgt aussieht:Shell Scripting und regulären Ausdrücken (? Sed, awk, grep ...)

user ID time started time ended yes/no 
3523   15:00   0  yes 
2356   12:13  12:18  yes 
4690   09:10   0  no 

Ich möchte Shell-Skript schreiben, die alle das herausgreifen wird Zeilen in der Datei, die haben eine Zeit von '0' und 'ja' beendet.

Für dieses Beispiel würde es die erste Zeile nur sein:

3523  15:00  0  yes 

Antwort

3

awk '$3 == "0" && $4 == "yes" { print; }' myfile

+0

arbeiten Wow, ich war nicht klar, wie einfach dies zu tun ist awk. Als Nebenfrage vor der Druckanweisung muss man END schreiben? –

+2

Werfen Sie einen Blick auf die Manpage für awk. Ein awk-Skript ist im Grunde eine Liste von CONDITION ACTION-Paaren. In diesem Fall lautet die Bedingung $ 3 = 0 und $ 4 = yes. Die entsprechende Aktion ist Drucken. END ist eine Bedingung, die nach dem Lesen der letzten Zeile der Datei erfüllt ist. Alle danach getätigten Aktionen werden nur am Ende der Datei ausgeführt. An diesem Punkt wird für den Druck keine Zeile mehr angezeigt. In der Praxis hätten andere Klauseln Werte in Globals gespeichert, auf die die END-Aktionen zurückgreifen können. – jtdubs

+2

Wenn Sie mit awk vertraut sind, möchten Sie vielleicht den '{print}' body entfernen (was die Standardaktion ist): 'awk '$ 3 == 0 && $ 4 ==" ja "' Datei' –

1
grep -E '^[^ ]+ +[^ ]+ +0 +yes$' inputfile 

oder

grep -E '^([^ ]+ +){2}0 +yes$' inputfile 

oder

sed -n '/^\([^ ]\+ \+\)\{2\}0 \+yes$/p' inputfile 

oder

sed -nr '/^([^ ]+ +){2}0 +yes$/p' inputfile 
1

Dies könnte für Sie arbeiten:

sed '/\s0\s\+yes\s*$/!d' inputfile 
1

dies wird auch

grep '............................0........yes' myfile

+1

Das ist schrecklich, aber ich lol'd. –