¿Cómo ejecutar grep en una sola columna?


42

Quiero grep la salida de mi ls -lcomando:

-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 rahmuen la columna $ 3, por lo que el resultado de mi grepcomando 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.


55
Tenga en cuenta que analizar la salida de lses inherentemente frágil (piense qué sucede si un nombre de usuario contiene espacios en blanco, y sí, esto sucede en algunas plataformas). Usar en su findlugar.
Gilles 'SO- deja de ser malvado'

Esto no responde la pregunta del título, pero mencionaré que la --printfopción statpuede ser útil en lugares donde de lo contrario podría considerar el análisis ls. Pero generalmente, findes lo que quieres (como mencionó @Gilles).
Comodín el

Respuestas:


49

¡Una vez más awksalva el día!

Aquí hay una manera sencilla de hacerlo, con una sintaxis relativamente simple:

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

o incluso más simple: (Gracias a Peter.O en los comentarios)

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

99
O: ls -l | awk '$3=="rahmu"'... y, por cierto, el (paréntesis de apertura debería ser después if...awk '{if($3 ...'
Peter

3
@ Peter.O +1 de mi parte. Su comando es más conciso, correcto, ya que imprimir es el valor predeterminado para una coincidencia awk.
bsd

Para evitar problemas de localización (formato de fecha afecta orden de las columnas) se sugiere a menudo para asegurar formato y lenguaje estándar:LANG=C ls -l | awk ...
fheub


11

Si por columna te refieres a una columna de tamaño fijo, podrías:

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

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).


2

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:

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

La parte encerrada por '//' puede ser cualquier tipo de expresión regular.


1

Para grep basado en una sola columna de nombre de usuario (e imprimir solo archivos), puede intentar:

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

Para directorios, cambie -a d, 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.