web-dev-qa-db-fra.com

Imprimer uniquement les lignes dont le deuxième champ correspond à certains critères

J'ai

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

J'ai besoin de awk pour imprimer toutes les lignes dans lesquelles $2 est LINUX.

36
yael

Dans awk:

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

Voir awk par exemple pour une bonne introduction à awk.

Dans sed:

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

Voir sed par exemple pour une bonne introduction à sed.

69
Hank Gay

Voici un cas dans lequel vous pouvez utiliser la belle idiomatique awk:

awk '$2=="LINUX"' file

C'est:

  • L'action par défaut de awk en condition True est d'imprimer la ligne courante.
  • Puisque $2 == "LINUX" Est vrai chaque fois que le deuxième champ est LINUX, cela imprimera les lignes dans lesquelles cela se produit.

Dans le cas où vous souhaitez imprimer toutes ces lignes correspondant à LINUX peu importe si elles sont en majuscules ou en minuscules, utilisez toupper() pour toutes les mettre en majuscule:

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

Ou IGNORECASE avec l'une de ces syntaxes:

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

Essayez-les:

egrep -i '^\w+ LINUX ' myfile

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

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

modifier: modifié pour l'insensibilité à la casse

4
B Johnson

Dans GNU sed les correspondances insensibles à la casse peuvent être faites en utilisant le modificateur I:

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

Correspondra de manière robuste à "linux", "Linux", "LINUX", "LiNuX" et d'autres comme deuxième champ (après le premier champ qui peut être n'importe lequel caractère non blanc) et entouré de n'importe quelle quantité (au moins un) de n'importe quel espace (principalement espace et tabulation, bien que vous puissiez utiliser [:blank:] pour le limiter strictement à ceux-ci).

3