web-dev-qa-db-fra.com

Comment exécuter grep sur une seule colonne?

Je veux récupérer la sortie de mon ls -l commande:

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Je veux courir grep rahmu sur la colonne $ 3 uniquement, donc la sortie de ma commande grep devrait ressembler à ceci:

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Quelle est la manière la plus simple de procéder? La réponse doit être portable sur de nombreux Unices, en se concentrant de préférence sur Linux et Solaris.

NB: je ne cherche pas un moyen de trouver tous les fichiers appartenant à un utilisateur donné. Cet exemple n'a été donné que pour clarifier ma question.

43
rahmu

Une fois de plus awk sauve la mise!

Voici une façon simple de le faire, avec une syntaxe relativement simple:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

ou encore plus simple: (Merci à Peter.O dans les commentaires)

ls -l | awk '$3 == "rahmu"' 
50
rahmu

Si vous cherchez à ne faire correspondre qu'une partie de la chaîne sur une colonne donnée, vous pouvez utiliser les conseils de https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly -matches

some_command | awk '$6 ~ /string/'
17
Colin D

Si par colonne, vous voulez dire une colonne de taille fixe, vous pouvez:

ls -l | grep "^.\{15\}rahmu"

^ signifie le début de la ligne, . signifie n'importe quel caractère et \{15\} signifie exactement 15 occurrences du caractère précédent (n'importe quel caractère dans ce cas).

11
jfg956

Je sais que je suis en retard à la fête, mais je crois qu'une solution très générale à ce problème est d'utiliser awk avec des expressions régulières comme ceci:

awk '$3~/rahmu/{print}' input_file

La partie entourée de '//' peut être n'importe quel type d'expression régulière.

2
PejoPhylo

Pour grep basé sur une seule colonne de nom d'utilisateur (et imprimer uniquement les fichiers), vous pouvez essayer:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

Pour les répertoires, modifiez - dans d, pour tout type supprimez -.

Il sélectionne essentiellement chaque colonne par \S\+\s\+ qui correspond à un caractère non-espace suivi d'un espace, donc nous faisons correspondre trois premières colonnes puis le nom d'utilisateur.

1
kenorb