Saya perlu mencari semua direktori home pengguna yang terdaftar menggunakan grep dari / etc / passwd

8

Saya punya pertanyaan yang mirip dengan yang lain di situs ini di mana individu harus menemukan daftar semua pengguna menggunakan grep atau awk dari / etc / passwd. Itu berhasil bagi saya, tetapi saya sudah mencoba menerjemahkannya untuk menemukan dan mendaftar direktori home mereka juga. Saya sudah tahu Anda tidak bisa melakukannya dalam satu baris jadi saya tahu saya akan menggunakan pipa. Saya sudah melakukan riset online, tetapi saya tidak bisa mengatasinya. Jika saya menggunakan grep dan melakukan sesuatu seperti berikut:

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

... itu mungkin akan memberi saya kesalahan atau itu juga akan menunjukkan kepada saya file / bin / bash yang bukan yang saya inginkan. Saya hanya perlu nama pengguna dan direktori home mereka terdaftar menggunakan grep! Saya juga tidak yakin apakah * akan menampilkan garis miring ke depan sebagai karakter, karena beberapa direktori home memiliki lebih dari dua / (garis miring).

NarinderRSharma
sumber
3
Juga, /etc/passwdmungkin atau mungkin tidak di mana semua pengguna berada. Pertimbangkan juga getent passwd.
Thrig

Jawaban:

10

Grep sebenarnya bukan alat untuk memilah data dengan cara ini, grep lebih untuk pencocokan pola dan Anda mencoba melakukan pemrosesan teks. Anda ingin menggunakan awk.

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

awk Perintah

-F":" Set pembatas data ke:

$7 == "/bin/false" Cek apakah kolom data ke-7 adalah / bin / false

{print "User: "$1 "Home Dir: "$6}' Mengatakan untuk mencetak kolom pertama dan keenam dalam format yang ditentukan.

/etc/passwd Apakah file yang sedang kami proses

Zachary Brady
sumber
Saya tidak terlalu suka awk, bisakah Anda menjelaskan apa -F: dan '{print $ 1 "" $ 6}' lakukan dengan tepat?
NarinderRSharma
Saya memperbarui jawaban saya untuk menjawab pertanyaan Anda
Zachary Brady
ya lihat untuk saya ketika saya masih menunjukkan enkripsi kata sandi, UID GIDS jenis shell yang kita gunakan. Saya membutuhkannya hanya untuk mencetak pengguna dan mereka direktori home, tidak ada yang lain. menggunakan grep atau awk tentunya.
NarinderRSharma
ketika saya menggunakan yang berikut: grep -oE '^[^:]+' /etc/passwdyang memberi saya hanya pengguna yang saya butuhkan untuk pipline sesuatu seperti itu atau sesuatu yang mirip untuk memiliki direktori rumah di sana bersama mereka
NarinderRSharma
1
Bisakah kita melihat baris sampel (dikaburkan) dari passwd dll Anda? Kedengarannya tidak seperti itu: dibatasi atau jika ya, itu tidak ditata secara normal.
Zachary Brady
18

Anda dapat menggunakan cutuntuk membagi file dengan kolom pada pembatas tertentu:

cut -d: -f6 /etc/passwd

Atau -f1,6untuk kolom (bidang) 1 dan 6.

Stefano Palazzo
sumber
4
Alat sederhana yang melakukan satu pekerjaan dan melakukannya dengan baik. Tambah satu!
fd0
1

Seperti yang orang lain tunjukkan, grepbukan alat terbaik untuk ini. Jika Anda bersikeras menggunakannya, dan jika Anda grepmendukung -o(hanya mencetak bagian yang cocok dari baris) dan -P(menggunakan Perl Regular Regular Expressions), Anda dapat melakukan ini:

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

Perhatikan bahwa ini akan mencetak semua pengguna, termasuk pengguna sistem. Saya hanya menampilkan 4 baris sebagai contoh.

Itu akan mencetak nama pengguna dan direktori home semua pengguna tetapi pada baris terpisah. Anda kemudian harus bergabung dengan setiap pasangan garis untuk menyatukannya:

$ 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

Penjelasan

Regex memiliki dua bagian, ia mencari ^[^:]+ATAU (itulah |artinya) .*:\K[^:]+(?=:[^:]+). Yang pertama mencari satu atau lebih :karakter dari awal baris. Ini cocok dengan nama pengguna. Bagian kedua mencari sebanyak mungkin karakter hingga a :( .*:) dan kemudian membuangnya (itulah \Kfungsinya) sehingga tidak dicetak. Kemudian cocok dengan string non- :yang diikuti oleh :dan non- :. The (?=foo)membangun disebut lookahead positif dan merupakan cara yang cocok dengan karakter setelah pola tanpa termasuk karakter-karakter dalam pertandingan itu sendiri.

The perlperintah akan menggantikan baris baru dengan :dan ruang jika nomor baris saat ini ( $.) habis dibagi 2. Jadi, setiap baris kedua.

terdon
sumber
perl dapat melakukan seluruh pekerjaan dengan 'awk-mode' perl -naf: -e 'print $F[0]." : ".$F[5].$/'jadi sed 'N;s/\n/ : /'mungkin pasangan yang lebih baik grep -oP.
dave_thompson_085
0

Saya percaya bahwa Anda dapat melakukan ini dengan "cut", menggunakan hanya satu biner, menghindari pipa, mencapai hasil yang sama dengan jawaban lainnya, tetapi dengan cara yang lebih elegan :), seperti ini:

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

Jika Anda ingin output + urutan abjad diformat lebih baik, ini dia, tapi untungnya, Anda harus menggunakan lebih banyak biner:

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