Raih isi file tertentu

9

Jadi saya tahu ada alat untuk masalah ini karena saya pernah mendengarnya, tapi saya tidak tahu apa itu.

Saya ingin melakukan sesuatu seperti memfilter semua data tetapi nama pengguna di / etc / passwd.

Sebagai contoh, saya ingin mengambil user1, user2, dan user3 dari file berikut. Dalam hal ini, logikanya bisa "Ambil teks hingga ':' yang pertama pada setiap baris file".

user1:x:1:4
user2:x:2:5
user3:x:3:6

Outputnya adalah:

user1
user2
user3
mouche
sumber

Jawaban:

19

cutada untuk tujuan ini. The -dbendera menentukan pembatas, dan -fmenentukan yang ladang untuk output:

cut -d: -f1 /etc/passwd

Argumen untuk -fdapat berupa sesuatu 1,3untuk menunjukkan bidang pertama dan ketiga, atau 1-3untuk menunjukkan tiga pertama; ada juga -bdan -ctanda untuk membaca byte dan karakter, bukan bidang. Jika Anda membutuhkan sesuatu yang lebih fleksibel, umumnya awkakan melakukan trik (lihat jawaban Matius )

Michael Mrozek
sumber
13

Setiap kali Anda ingin mengekstrak data dari input tabular, Anda harus mempertimbangkan awk . Ini tersedia di hampir setiap sistem Unix, jadi itu kebiasaan yang baik untuk dilakukan:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': mendefinisikan ":" sebagai pembatas kolom.
  • '{}': jalankan instruksi ini untuk setiap baris.
  • print $1: cetak kolom pertama ke layar.
Matthew Brannigan
sumber
3
Catatan acak: awkmengambil nama file, sehingga Anda dapat melewati pipa dan melakukannyaawk -F: '{print $1}' /etc/passwd
Michael Mrozek
Saya sepertinya selalu lupa bahwa awk mengambil nama file, saya sepertinya selalu menggunakannya dalam pipa ... sesuatu seperti sed | awk dll ...
Matthew Brannigan
hampir semua yang bekerja dengan file menggunakan nama file ( trdan atbeberapa contoh dari beberapa hal yang tidak).
Dijeda sampai pemberitahuan lebih lanjut.
3

Inilah Perl one-liner:

perl -F/:/ -lane 'print $F[0]' /etc/passwd
Zaid
sumber
1

Di bawah perl dan awk, ada alat ketiga untuk pekerjaan seperti itu, yaitu:

sed 's/:.*//' FILE 

Ini adalah perintah substitusi: pengganti dari titik dua:, diikuti oleh titik, yang merupakan joker untuk karakter apa pun, dengan jumlah apa pun (*), tanpa apa-apa.

Ini adalah (ubstitute) / FROM / TO / 'dengan TO menjadi kosong, yang berarti' hapus semua dari yang pertama (karena sed secara default serakah) kolon (sampai akhir baris, karena sed bekerja dengan baik dengan seluruh baris).

Tentu saja cutitu perintah yang baik juga, tetapi saya akan mengatakan dari keluarga yang berbeda.

Pengguna tidak diketahui
sumber
1

Dalam contoh Anda, ketiga nama memiliki panjang yang sama. Dalam kasus seperti itu - yang mungkin terjadi, tetapi tidak begitu mungkin dengan / etc / passwd - Anda mungkin menggunakan colrm juga:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

atau tentu saja

cat FILE | colrm 6 

(kasus yang jarang terjadi di mana useless use of cattidak berlaku, karena Anda tidak dapat memberikan FILE untuk bertindak sebagai parameter.)

Pengguna tidak diketahui
sumber
catmasih berguna di sana: colrm 6 < FILE.
manatwork
Ya, tapi tidak sia-sia, seperti dalam menelepon cat foo | grep bar.
pengguna tidak diketahui
1

Hanya untuk kelengkapan, tidak perlu untuk perintah eksternal, shell (Bourne shell atau yang kompatibel) dapat mengatasinya sendiri:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

Tentu saja, ini mungkin yang paling lambat dari semua solusi yang mungkin, jadi untuk file besar pilih yang lain.

manatwork
sumber