Tengo una pregunta similar a otra en este sitio donde la persona tenía que encontrar una lista de todos los usuarios que usaban grep o awk desde / etc / passwd. Eso funcionó para mí, pero he intentado traducirlo para encontrar y enumerar los directorios principales de ellos también. Ya sé que no puedes hacerlo en una línea, así que sé que usaría una tubería. He hecho mi investigación en línea, pero no puedo resolver el problema. Si uso grep y hago algo como lo siguiente:
grep -oE '^[/*/]$' /etc/passwd
... probablemente me daría un error o también me mostrará los archivos / bin / bash que no es lo que quiero. ¡Solo necesito los nombres de usuario y sus directorios de inicio listados usando grep! Tampoco estoy seguro de si el * mostrará otras barras diagonales como caracteres, ya que algunos directorios principales tienen más de solo dos / '(barras diagonales).
fuente
/etc/passwd
puede o no estar donde están todos los usuarios. Tenga en cuenta tambiéngetent passwd
.Respuestas:
Grep realmente no es la herramienta para analizar los datos de esta manera, grep es más para la coincidencia de patrones y estás tratando de procesar texto. Te gustaría usar awk.
awk
El comando-F":"
Establece el delimitador de datos en:$7 == "/bin/false"
Comprueba si la séptima columna de datos es / bin / false{print "User: "$1 "Home Dir: "$6}'
Dice imprimir la primera columna y la sexta columna en el formato especificado./etc/passwd
Es el archivo que estamos procesandofuente
grep -oE '^[^:]+' /etc/passwd
eso me da solo los usuarios que necesito para canalizar algo como eso o algo similar para tener los directorios principales allí con ellosPuede usar
cut
para dividir archivos con columnas en un delimitador específico:O
-f1,6
para las columnas (campos) 1 y 6.fuente
Como otros han señalado,
grep
no es la mejor herramienta para esto. Si insiste en usarlo, y sigrep
admite-o
(solo imprima la parte coincidente de la línea) y-P
(use Expresiones regulares compatibles con Perl), puede hacer esto:Tenga en cuenta que esto imprimirá a todos los usuarios, incluidos los usuarios del sistema. Solo estoy mostrando 4 líneas como ejemplo.
Eso imprimirá el nombre de usuario y los directorios de inicio de todos los usuarios, pero en líneas separadas. Luego debe unir cada par de líneas para unirlas:
Explicación
La expresión regular tiene dos partes, busca
^[^:]+
OR (eso es lo que|
significa).*:\K[^:]+(?=:[^:]+)
. El primero busca uno o más no:
caracteres desde el principio de la línea. Esto coincide con el nombre de usuario. La segunda parte busca tantos caracteres como sea posible hasta a:
(.*:
) y luego los descarta (eso es lo que\K
hace) para que no se impriman. Luego coincide con una cadena de non-:
que es seguida por:
y non-:
. La(?=foo)
construcción se denomina anticipación positiva y es una forma de hacer coincidir los caracteres después de un patrón sin incluir esos caracteres en la coincidencia misma.El
perl
comando reemplazará las nuevas líneas con:
y espacios si el número de línea actual ($.
) es divisible por 2. Entonces, cada segunda línea.fuente
perl -naf: -e 'print $F[0]." : ".$F[5].$/'
por lo quesed 'N;s/\n/ : /'
podría ser un mejor socio paragrep -oP
.Creo que puedes hacer esto con "cortar", usando solo un binario, evitando tuberías, alcanzando los mismos resultados que las otras respuestas, pero de una manera más elegante :), así:
Si desea tener una salida mejor formateada + orden alfabético, aquí está, pero la compensación es eso, debe usar más binarios:
fuente