Comment exécuter grep sur une seule colonne?

42

Je veux grep la sortie de ma ls -lcommande:

-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 utiliser grep rahmuuniquement la colonne $ 3, le résultat de ma grepcommande devrait alors 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

Quel est le moyen le plus simple de le faire? La réponse doit être portable sur plusieurs Unices, de préférence sous 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.

Rahmu
la source
5
Notez que l' analyse de la sortie de lsest intrinsèquement fragile (imaginez ce qui se passe si un nom d'utilisateur contient des espaces - et oui, cela se produit sur certaines plates-formes). Utilisez à la findplace.
Gilles, arrête de faire le mal
Cela ne répond pas à la question du titre, mais je mentionnerai que l' --printfoption statpeut être utile dans des endroits où vous pourriez autrement envisager d'analyser ls. Mais généralement, findc’est ce que vous voulez (comme @Gilles l’a mentionné).
Wildcard

Réponses:

49

Une fois de plus awksauve la journée!

Voici un moyen simple de le faire, avec une syntaxe relativement simple:

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

ou même plus simple: (Merci à Peter.O dans les commentaires)

ls -l | awk '$3 == "rahmu"' 
Rahmu
la source
9
Ou: ls -l | awk '$3=="rahmu"'... et d'ailleurs, le (support d' ouverture devrait être après if...awk '{if($3 ...'
Peter.O
3
@ Peter.O +1 de moi. Votre commande est plus succincte, correcte, car print est la valeur par défaut pour une correspondance awk.
bsd
Pour éviter les problèmes de localisation (le format de date ayant une incidence sur l'ordre des colonnes), il est souvent suggéré de s'assurer que le format et la langue sont standard:LANG=C ls -l | awk ...
fheub
11

Si par colonne, vous entendez 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).

jfg956
la source
2

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

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

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

PejoPhylo
la source
1

Pour grep en fonction d'une colonne de nom d'utilisateur unique (et imprimer uniquement les fichiers), vous pouvez essayer:

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

Pour les répertoires, remplacez -par d, pour tout type, supprimez -.

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

Kenorb
la source