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

8

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

NarinderRSharma
fuente
3
Además, /etc/passwdpuede o no estar donde están todos los usuarios. Tenga en cuenta también getent passwd.
thrig

Respuestas:

10

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 -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 imprimir la primera columna y la sexta columna en el formato especificado.

/etc/passwd Es el archivo que estamos procesando

Zachary Brady
fuente
No me gusta mucho awk, ¿podría explicar qué hacen exactamente -F: y '{print $ 1 "" $ 6}'?
NarinderRSharma
Actualicé mi respuesta para responder a su pregunta
Zachary Brady
sí, míralo cuando lo haga, todavía me muestra los cifrados de contraseña, UID GIDS qué tipo de shell estamos usando. Lo necesito para imprimir los usuarios y son directorios de inicio, nada más. usando grep o awk, por supuesto.
NarinderRSharma
cuando uso lo siguiente: grep -oE '^[^:]+' /etc/passwdeso me da solo los usuarios que necesito para canalizar algo como eso o algo similar para tener los directorios principales allí con ellos
NarinderRSharma
1
¿Podemos ver una línea de muestra (ofuscada) de su contraseña etc? No parece que esté delimitado o, si lo está, no se presenta normalmente.
Zachary Brady
18

Puede usar cutpara dividir archivos con columnas en un delimitador específico:

cut -d: -f6 /etc/passwd

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

Stefano Palazzo
fuente
44
Herramientas simples que hacen un trabajo y lo hacen bien. ¡Mas uno!
fd0
1

Como otros han señalado, grepno es la mejor herramienta para esto. Si insiste en usarlo, y si grepadmite -o(solo imprima 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 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:

$ 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 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 \Khace) 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 perlcomando 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.

terdon
fuente
Perl puede hacer todo el trabajo con 'awk-mode', perl -naf: -e 'print $F[0]." : ".$F[5].$/'por lo que sed 'N;s/\n/ : /'podría ser un mejor socio para grep -oP.
dave_thompson_085
0

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í:

$ 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 compensación es eso, 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
ivanleoncz
fuente