2011-01-17 11 views
6

Ich muss eine Zeile basierend auf Spaltenwert wie Abfragen einer Datenbank abrufen. Ich habe einen Befehl Ausgabe wie folgt,Filtern von Linux-Befehlsausgabe

Namen ID Mem VCPUs Staat
Zeit (s)

Domain-0 0 15485 16 r ----- 1779042,1

prime95-01 512 1
-b ---- 61,9

Hier muss ich nur die Zeilen aufzulisten, wo Zustand ist "r". So etwas wie dies,

Domain-0 0 15485 16
r ----- 1779042,1

Ich habe versucht, "grep" und "awk" verwenden, aber noch bin ich nicht in der Lage erfolgreich zu sein .

Bitte helfen Sie mir zu diesem Thema.

Grüße, Raaj

Antwort

2

Versuch:

awk '$5 ~ /^r.*/ { print }' 

So:

cat file | awk '$5 ~ /^r.*/ { print }' 
+0

Vielen Dank. Dies half mein Problem zu lösen. – Raajkumar

+3

@Raajkumar: Willkommen bei StackOverflow. Bitte nehmen Sie sich eine Minute, um diesen Abschnitt darüber zu lesen, wie wir hier "Vielen Dank" sagen: http://stackoverflow.com/faq#howtoask – Johnsyweb

+0

@Raajkumar - tldr akzeptieren Sie die Antwort und Upvote, wenn Sie wollen – Ben

6

Es gibt eine abwechslungsreiche Auswahl von Werkzeugen für die Filterung zur Verfügung.

Wenn Sie nur mit "r -----" grep Linien wollen, ist mehr als genug:

command | grep "r-----" 

Oder

cat filename | grep "r-----" 

Zitate sind optional aber könnte grep Stolpern über das verhindern - ‚s

+0

"Zitate sind optional, aber könnte verhindern, dass Grep über die -'s stolpert "Sie sind. Aber sie werden nicht. – Johnsyweb

0

grep Lösung:

command | grep -E "^([^ ]+){4}r" 

Was dies bewirkt (-E schaltet erweiterten Regexp ein):

Der erste Caret (^) entspricht dem Zeilenanfang. [^] entspricht genau einem Vorkommen eines Nicht-Leerzeichen-Zeichens, der folgende Modifikator (+) erlaubt es auch, mehr Vorkommen zu finden.

Gruppiert mit dem nachgestellten Leerzeichen in ([^] +), entspricht es einer beliebigen Folge von Leerzeichen, gefolgt von einem Leerzeichen. Der Modifikator {4} erfordert, dass dieses Konstrukt genau viermal übereinstimmt.

Das einzelne "r" ist dann das literale Zeichen, nach dem Sie suchen.

In einfachen Worten diese geschrieben werden könnten, wie „Wenn die Zeile < beginnt ^> mit vier Saiten, die < gefolgt von einem Leerzeichen werden ([^] +) {4}> und das nächste Zeichen ist, dann ist die Linie übereinstimmt .. "

Eine sehr gute Einführung in reguläre Ausdrücke wurde von Jan Goyvaerts (http://www.regular-expressions.info/quickstart.html) geschrieben worden

2

grep kann dies für Sie erledigen:

yourcommand | grep -- 'r-----' 

Es ist oft nützlich, um die (vollständige) Ausgabe in eine Datei später zu analysieren, um zu speichern. Dafür ich tee verwenden.

yourcommand | tee somefile | grep 'r-----' 

Wenn Sie fi wollen nd die Zeile mit „-b ----“ ein wenig später ohne erneute laufen yourcommand, können Sie einfach verwenden:

grep -- '-b----' somefile 

Keine Notwendigkeit für cat hier!

ich -- nach Ihren Anruf grep empfiehlt sich, da Ihre Muster minus-Zeichen enthalten und wenn das Minuszeichen am Anfang des Musters ist, das wie eine Option Argument grep eher als ein Teil des Musters aussehen würde .

+0

@ downvoter: Warum? – Johnsyweb

+1

Dies funktioniert nicht – Tyguy7

+0

Welcher Teil funktioniert nicht? Es tat, als ich es vor fast sieben Jahren schrieb, aber ich freue mich, es zu aktualisieren, wenn Sie den Fehler aufzeigen können. – Johnsyweb

0

Filterung von awk cmd in Linux: -

Zum einen die Spalte für diese cmd und speichern file2 finden: -

awk '/ Domain-0 0 15485 /' file1> file2

Ausgang: -

Domain-0 0 15485 16 r ----- 1779042,1

nach, dass awk cmd in file2: -

awk '{$ 1, $ 2, $ 3, $ 4, "\ n", $ 5, $ 6 Drucken}' file2

Endgültige Ausgabe: -

Domain-0 0 15485 16

r ----- 1779042.1