Je veux grep la sortie de ma 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 utiliser grep rahmu
uniquement la colonne $ 3, le résultat de ma grep
commande 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.
ls
est 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 à lafind
place.--printf
optionstat
peut être utile dans des endroits où vous pourriez autrement envisager d'analyserls
. Mais généralement,find
c’est ce que vous voulez (comme @Gilles l’a mentionné).Réponses:
Une fois de plus
awk
sauve la journée!Voici un moyen simple de le faire, avec une syntaxe relativement simple:
ou même plus simple: (Merci à Peter.O dans les commentaires)
la source
ls -l | awk '$3=="rahmu"'
... et d'ailleurs, le(
support d' ouverture devrait être aprèsif
...awk '{if($3 ...'
LANG=C ls -l | awk ...
Si vous souhaitez faire correspondre une partie seulement de la chaîne d'une colonne donnée, vous pouvez utiliser les conseils de https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches
la source
Si par colonne, vous entendez une colonne de taille fixe, vous pouvez:
où
^
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).la source
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:
La partie entourée par '//' peut être n'importe quel type d'expression régulière.
la source
Pour grep en fonction d'une colonne de nom d'utilisateur unique (et imprimer uniquement les fichiers), vous pouvez essayer:
Pour les répertoires, remplacez
-
pard
, 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.la source