Saya punya contoh file / etc / passwd seperti ini:
tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash
Saya mencoba mendaftar semua pengguna dengan folder rumah di /home/
.
saya menulis
cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
di mana e.txt adalah teks yang saya salin di sini.
Saya mengerti ada masalah dengan backslash yang merupakan karakter pelarian, tetapi bagaimana cara memperbaikinya sehingga saya dapat mendaftarnya dalam satu baris perintah?
text-processing
awk
wildcards
passwd
erans
sumber
sumber
cat
dan pipa ke alat sukaawk
ataused
atau sejenisnya, karena mereka dapat diberi nama file sebagai argumen.grep home e.txt | cut -d ":" -f 1
. Selamat atas penghargaan UUOC Anda. Namun, ini bukan solusi yang baik. Bagaimana jika ada layanan "homebackups" yang berjalan di bawah pengguna terpisah yang dinamai daemon? Itu positif palsu.cat > tool
varian dari baris perintah seperti itu karena dapat meningkatkan kejelasan dengan mempertahankan aliran kiri ke kanan dari input-pemrosesan-output dari rantai pipa. Ini adalah kurang efisien, tapi hampir selalu minimal jadi. Itu juga membuat menambahkan bilah kemajuan di mana relevan & berguna saat menjalankan secara interaktif sangat jelas (hanya ganticat
denganpv
jika itu diinstal).Jawaban:
Anda dapat menghindari garis miring ke depan seperti yang ditunjukkan di bawah ini:
Trik lain akan menggunakan pemisah bidang kompleks:
-F'[:/]'
- memperlakukan keduanya:
dan/
menjadi pemisah lapangansumber
Anda dapat menggunakan kutipan alih-alih
/
untuk regex, untuk menghindari lolos dari/
:Dengan
awk
,{if (foo) ... }
seringkali bisa disederhanakan menjadi adilfoo {...}
.sumber
Dengan asumsi
e.txt
sebenarnya/etc/passwd
, Anda harus benar-benar menggunakangetent passwd
daripada mem-parsing file karena informasi akun pengguna dapat disimpan di beberapa lokasi yang ditentukan dalam/etc/nsswitch.conf
seperti LDAP.Perhatikan bahwa
print
pernyataan itu tersirat ketika kondisinya benar. Itu akan mencetak seluruh baris. Ini hanya akan mencetak nama pengguna:sumber
Alternatif bagi kita yang tidak suka awk:
Penjelasan:
grep -E
memungkinkan penggunaan beberapa fitur ekspresi reguler yang diperluas([^:]*:)
cocok dengan satu kolom, termasuk pemisah ':' berikut^([^:]*:){5}
cocok dengan lima kolom pertama dari setiap baris^([^:]*:){5}/home/
cocok dengan setiap baris di mana kolom ke-6 dimulai dengan '/ home /'cut -d: -f1
hanya memilih kolom pertama dari inputnya, menggunakan:
sebagai pemisah kolomsumber
Anda juga dapat menggunakan
index
untuk pencocokan string tetap sepertigrep -F
dan menggunakan nilai kembali untuk memastikan itu cocok dengan awal stringatau jika diperlukan regex, berikan sebagai variabel lingkungan
sumber
Hanya untuk variasi
Penjelasan
Variasi jika Anda ingin pilih-pilih di mana
/home/
ditemukansumber