Necesito encontrar los directorios de inicio de todos los usuarios enumerados usando grep desde /etc/passwd

Necesito encontrar los directorios de inicio de todos los usuarios enumerados usando grep desde /etc/passwd

Tengo una pregunta similar a otra en este sitio donde el individuo tenía que encontrar una lista de todos los usuarios que usaban grep o awk desde /etc/passwd. Eso funcionó para mí, pero intenté traducirlo para buscar y enumerar también sus directorios de inicio. Ya sé que no puedes hacerlo en una línea, así que sé que usaría una canalización. Hice mi investigación en línea pero no puedo entender cuál es 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 * mostrará otras barras diagonales como caracteres, ya que algunos directorios de inicio tienen más de dos / (barras diagonales).

Respuesta1

Puedes usarcutpara dividir archivos con columnas en un delimitador específico:

cut -d: -f6 /etc/passwd

O -f1,6para las columnas (campos) 1 y 6.

Respuesta2

Grep realmente no es la herramienta para analizar datos de esta manera; grep es más para la coincidencia de patrones y estás intentando realizar un procesamiento de texto. Deberías usar awk.

awk -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd
  • 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 que se imprima la primera columna y la sexta columna en el formato especificado.

  • /etc/passwd– ¿Es el archivo que estamos procesando?

Respuesta3

Como otros han señalado, grepno es la mejor herramienta para esto. Si insiste en usarlo, y si admite grep( -oimprima solo la parte coincidente de la línea) y -P(use expresiones regulares compatibles con Perl), puede hacer esto:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/password
terdon
/home/terdon
bob
/home/bob

Tenga en cuenta que esto imprimirá a todos los usuarios, incluidos los usuarios del sistema. Solo muestro 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 debes unir cada par de líneas para unirlas:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/passwd | perl -pe 's/\n/ : / if $.%2'
root : /root
bin : /bin
daemon : /
mail : /var/spool/mail
ftp : /srv/ftp
http : /srv/http
uuidd : /
dbus : /
nobody : /
systemd-journal-gateway : /
systemd-timesync : /
systemd-network : /
systemd-bus-proxy : /
systemd-resolve : /
systemd-journal-upload : /
systemd-coredump : /
systemd-journal-remote : /
terdon : /home/terdon
avahi : /
polkitd : /
colord : /var/lib/colord
rtkit : /proc
gdm : /var/lib/gdm
git : /
bob : /home/bob

Explicación

La expresión regular tiene dos partes, busca ^[^:]+OR (eso es lo que |significa) .*:\K[^:]+(?=:[^:]+). El primero busca uno o más :caracteres que no sean 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 que aparezca :( .*:) y luego los descarta (eso es lo que \Khace) para que no se impriman. Luego coincide con una cadena de non- :seguida de :y non- :. La (?=foo)construcción se llamaanticipación positivay es una forma de unir los personajesdespuésun patrón sin incluir esos personajes en el partido en sí.

El perlcomando reemplazará las nuevas líneas con :espacios si el número de línea actual ( $.) es divisible por 2. Entonces, cada segunda línea.

Respuesta4

Creo que puedes hacer esto con "cut", usando solo un binario, evitando los pipes, llegando a los mismos resultados que las otras respuestas, pero de una manera más elegante :), así:

$ cut -d : -f 1,6 /etc/passwd

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin
games:/usr/games
man:/var/cache/man
lp:/var/spool/lpd
mail:/var/mail
news:/var/spool/news
....

Si desea tener una salida mejor formateada + orden alfabético, aquí está, pero la desventaja es que debe usar más binarios:

$ cut -d : -f 1,6 /etc/passwd | sort | column

avahi-autoipd:/var/lib/avahi-autoipd        man:/var/cache/man
avahi:/var/run/avahi-daemon                 messagebus:/var/run/dbus
backup:/var/backups                         news:/var/spool/news
bin:/bin                                    nobody:/nonexistent
clickpkg:/nonexistent                       ntp:/home/ntp
colord:/var/lib/colord                      proxy:/bin
daemon:/usr/sbin                            pulse:/var/run/pulse
dnsmasq:/var/lib/misc                       root:/root
games:/usr/games                            rtkit:/proc
gnats:/var/lib/gnats                        saned:/home/saned
hplip:/var/run/hplip                        speech-dispatcher:/var/run/speech-dispatcher
irc:/var/run/ircd                           sync:/bin
ivanleon:/home/ivanleon                     sys:/dev
kernoops:/                                  syslog:/home/syslog
libuuid:/var/lib/libuuid                    usbmux:/home/usbmux
lightdm:/var/lib/lightdm                    usermetrics:/var/lib/usermetrics
list:/var/list                              uucp:/var/spool/uucp
lp:/var/spool/lpd                           whoopsie:/nonexistent
lxc-dnsmasq:/var/lib/lxc                    www-data:/var/www
mail:/var/mail

información relacionada