Quiero grep la salida de mi ls -l
comando:
-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
Solo quiero ejecutar grep rahmu
en la columna $ 3, por lo que el resultado de mi grep
comando debería verse así:
-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
¿Cuál es la forma más sencilla de hacerlo? La respuesta debe ser portátil en muchos Unices, preferiblemente enfocándose en Linux y Solaris.
NB: no estoy buscando una manera de encontrar todos los archivos que pertenecen a un usuario determinado. Este ejemplo solo se dio para aclarar mi pregunta.
ls
es inherentemente frágil (piense qué sucede si un nombre de usuario contiene espacios en blanco, y sí, esto sucede en algunas plataformas). Usar en sufind
lugar.--printf
opciónstat
puede ser útil en lugares donde de lo contrario podría considerar el análisisls
. Pero generalmente,find
es lo que quieres (como mencionó @Gilles).Respuestas:
¡Una vez más
awk
salva el día!Aquí hay una manera sencilla de hacerlo, con una sintaxis relativamente simple:
o incluso más simple: (Gracias a Peter.O en los comentarios)
fuente
ls -l | awk '$3=="rahmu"'
... y, por cierto, el(
paréntesis de apertura debería ser despuésif
...awk '{if($3 ...'
LANG=C ls -l | awk ...
Si desea hacer coincidir solo una parte de la cadena en una columna determinada, puede utilizar los consejos de https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches
fuente
Si por columna te refieres a una columna de tamaño fijo, podrías:
donde
^
significa el comienzo de la línea,.
significa cualquier carácter y\{15\}
significa exactamente 15 apariciones del carácter anterior (cualquier carácter en este caso).fuente
Sé que llego tarde a la fiesta, pero creo que una solución muy general a este problema es usar awk con expresiones regulares como esta:
La parte encerrada por '//' puede ser cualquier tipo de expresión regular.
fuente
Para grep basado en una sola columna de nombre de usuario (e imprimir solo archivos), puede intentar:
Para directorios, cambie
-
ad
, para cualquier tipo de eliminación-
.Básicamente, selecciona cada columna por la
\S\+\s\+
cual coincide con caracteres que no son espacios seguidos por caracteres de espacio, por lo que estamos haciendo coincidir tres primeras columnas y luego el nombre de usuario.fuente