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).
sumber
/etc/passwd
mungkin atau mungkin tidak di mana semua pengguna berada. Pertimbangkan jugagetent passwd
.Jawaban:
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
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 prosessumber
grep -oE '^[^:]+' /etc/passwd
yang memberi saya hanya pengguna yang saya butuhkan untuk pipline sesuatu seperti itu atau sesuatu yang mirip untuk memiliki direktori rumah di sana bersama merekaAnda dapat menggunakan
cut
untuk membagi file dengan kolom pada pembatas tertentu:Atau
-f1,6
untuk kolom (bidang) 1 dan 6.sumber
Seperti yang orang lain tunjukkan,
grep
bukan alat terbaik untuk ini. Jika Anda bersikeras menggunakannya, dan jika Andagrep
mendukung-o
(hanya mencetak bagian yang cocok dari baris) dan-P
(menggunakan Perl Regular Regular Expressions), Anda dapat melakukan ini: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:
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\K
fungsinya) 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
perl
perintah akan menggantikan baris baru dengan:
dan ruang jika nomor baris saat ini ($.
) habis dibagi 2. Jadi, setiap baris kedua.sumber
perl -naf: -e 'print $F[0]." : ".$F[5].$/'
jadised 'N;s/\n/ : /'
mungkin pasangan yang lebih baikgrep -oP
.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:
Jika Anda ingin output + urutan abjad diformat lebih baik, ini dia, tapi untungnya, Anda harus menggunakan lebih banyak biner:
sumber