![Necesito encontrar los directorios de inicio de todos los usuarios enumerados usando grep desde /etc/passwd](https://rvso.com/image/89172/Necesito%20encontrar%20los%20directorios%20de%20inicio%20de%20todos%20los%20usuarios%20enumerados%20usando%20grep%20desde%20%2Fetc%2Fpasswd.png)
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 usarcut
para dividir archivos con columnas en un delimitador específico:
cut -d: -f6 /etc/passwd
O -f1,6
para 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, grep
no es la mejor herramienta para esto. Si insiste en usarlo, y si admite grep
( -o
imprima 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 \K
hace) 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 perl
comando 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