Devo trovare tutte le home directory degli utenti elencate usando grep da / etc / passwd


8

Ho una domanda simile a un'altra su questo sito in cui l'individuo ha dovuto trovare un elenco di tutti gli utenti che utilizzano grep o awk da / etc / passwd. Ha funzionato per me, ma ho provato a tradurlo per trovare ed elencare anche le home directory. So già che non puoi farlo in una riga, quindi so che userei una pipeline. Ho fatto le mie ricerche online ma non riesco a capire il problema. Se uso grep e faccio qualcosa di simile al seguente:

   grep -oE '^[/*/]$' /etc/passwd 

... probabilmente mi darebbe un errore o mi mostrerà anche i file / bin / bash che non è quello che voglio. Ho solo bisogno dei nomi utente e delle loro directory home elencati usando grep! Non sono inoltre sicuro se * mostrerà altre barre come caratteri, poiché alcune home directory hanno più di due / '(barre).


3
Inoltre, /etc/passwdpuò essere o meno la posizione di tutti gli utenti. Considera anche getent passwd.
thrig

Risposte:


10

Grep non è davvero lo strumento per analizzare i dati in questo modo, grep è più per la corrispondenza dei modelli e stai cercando di eseguire l'elaborazione del testo. Vorresti usare awk.

awk -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd

awk Il comando

-F":" Imposta il delimitatore di dati su:

$7 == "/bin/false" Verifica se la settima colonna di dati è / bin / false

{print "User: "$1 "Home Dir: "$6}' Dice di stampare la prima colonna e la sesta colonna nel formato specificato.

/etc/passwd È il file che stiamo elaborando


Non sono troppo affezionato a Awk potresti spiegare cosa fanno esattamente -F: e '{print $ 1 "" $ 6}'?
NarinderRSharma,

Ho aggiornato la mia risposta per rispondere alla tua domanda
Zachary Brady,

sì, vedo per me quando lo faccio, mi mostra ancora le crittografie della password, UID GIDS che tipo di shell stiamo usando. Ne ho bisogno per stampare solo gli utenti e le loro home directory, nient'altro. usando grep o awk ovviamente.
NarinderRSharma,

quando uso quanto segue: grep -oE '^[^:]+' /etc/passwdquesto mi dà solo gli utenti che ho bisogno di pipeline di qualcosa del genere o qualcosa di simile per avere le home directory lì con loro
NarinderRSharma

1
Possiamo vedere una linea di esempio (offuscata) dal tuo passwd etc? Non sembra: delimitato o, se lo è, non è strutturato normalmente.
Zachary Brady,

18

È possibile utilizzare cutper dividere i file con colonne su un delimitatore specifico:

cut -d: -f6 /etc/passwd

O -f1,6per colonne (campi) 1 e 6.


4
Strumenti semplici che fanno un lavoro e lo fanno bene. Più uno!
fd0

1

Come altri hanno sottolineato, grepnon è lo strumento migliore per questo. Se insisti nell'usarlo e se grepsupporta -o(stampa solo la parte corrispondente della riga) e -P(usa espressioni regolari compatibili Perl), puoi farlo:

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

Si noti che ciò stamperà tutti gli utenti, inclusi gli utenti del sistema. Sto solo mostrando 4 righe come esempio.

Ciò stamperà il nome utente e le home directory di tutti gli utenti, ma su righe separate. È quindi necessario unire ogni coppia di linee per metterle insieme:

$ 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

Spiegazione

Il regex ha due parti, cerca ^[^:]+OR (questo è il |significato) .*:\K[^:]+(?=:[^:]+). Il primo cerca uno o più non :caratteri dall'inizio della riga. Questo corrisponde al nome utente. La seconda parte cerca il maggior numero possibile di personaggi fino a :( .*:) e poi li scarta (ecco cosa \Kfa) in modo che non vengano stampati. Quindi corrisponde a una stringa di non- :che è seguita da :e non- :. Il (?=foo)costrutto è chiamato lookahead positivo ed è un modo per abbinare i personaggi dopo un modello senza includere quei personaggi nella partita stessa.

Il perlcomando sostituirà le nuove righe con :e gli spazi se il numero di riga corrente ( $.) è divisibile per 2. Quindi, ogni seconda riga.


perl può fare tutto il lavoro con 'awk-mode', perl -naf: -e 'print $F[0]." : ".$F[5].$/'quindi sed 'N;s/\n/ : /'potrebbe essere un partner migliore per grep -oP.
dave_thompson_085,

0

Credo che puoi farlo con "cut", usando solo un binario, evitando pipe, raggiungendo gli stessi risultati delle altre risposte, ma in un modo più elegante :), in questo modo:

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

Se vuoi avere un output meglio formattato + ordine alfabetico, ecco, ma il compromesso è quello, devi usare più binari:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.