it-swarm.com.de

Drucken Sie nur Zeilen, bei denen das zweite Feld einigen Kriterien entspricht

Ich habe

1 LINUX param1 value1 
2 LINUXparam2 value2
3 SOLARIS param3 value3
4 SOLARIS param4 value4

Ich brauche awk, um alle Zeilen zu drucken, in denen $2 ist LINUX.

36
yael

In awk:

awk '$2 == "LINUX" { print $0 }' test.txt

Siehe awk by Example für eine gute Einführung in awk.

In sed:

sed -n -e '/^[0-9][0-9]* LINUX/p' test.txt

Siehe sed by Example für eine gute Einführung in sed.

69
Hank Gay

In diesem Fall können Sie die schöne Redewendung awk verwenden:

awk '$2=="LINUX"' file

Das ist:

  • Die Standardaktion von awk im Zustand True ist das Drucken der aktuellen Zeile.
  • Da $2 == "LINUX" Immer dann wahr ist, wenn das 2. Feld LINUX ist, werden die Zeilen gedruckt, in denen dies geschieht.

Wenn Sie alle Zeilen drucken möchten, die mit LINUX übereinstimmen, unabhängig davon, ob es sich um Groß- oder Kleinbuchstaben handelt, verwenden Sie toupper() , um sie alle in Großbuchstaben zu schreiben:

awk 'toupper($2)=="LINUX"' file

Oder IGNORECASE mit einer dieser Syntaxen:

awk 'BEGIN {IGNORECASE=1} $2=="LINUX"' file
awk -v IGNORECASE=1 '$2=="LINUX"' file
8
fedorqui

Probieren Sie diese aus:

egrep -i '^\w+ LINUX ' myfile

awk '{IGNORECASE=1}{if ($2 == "LINUX") print}' myfile

sed -ne '/^[0-9]* [Ll][Ii][Nn][Uu][Xx] /p' myfile

bearbeiten: geändert für Groß- und Kleinschreibung

4
B Johnson

In GNU sed kann die Groß- und Kleinschreibung nicht beachtet werden, indem der Modifikator I verwendet wird:

sed -n '/^[^[:space:]][[:space:]]\+linux[[:space:]]\+/Ip'

Entspricht robust "linux", "Linux", "LINUX", "LiNuX" und anderen als zweites Feld (nach dem ersten Feld, das beliebig Zeichen ohne Leerzeichen sein kann) und ist von einer beliebigen Anzahl umgeben (mindestens eines) von Leerzeichen (hauptsächlich Leerzeichen und Tabulatoren, obwohl Sie [:blank:] verwenden können, um es auf genau diese zu beschränken).

3