Kita tahu bahwa kita bisa mendapatkan kolom kedua dari baris yang kita inginkan dari file menggunakan dua teknik ini:
awk '/WORD/ { print $2 }' filename
atau
grep WORD filename| cut -f 2 -d ' '
Pertanyaan saya adalah:
- Apa perbedaan antara kedua perintah di atas?
- Mana yang memiliki kinerja terbaik?
- Apa keuntungan menggunakan
awk
lebih dari menggunakancut
, dan sebaliknya? - Pilihan apa yang
awk
memberi kita ke atascut
dan sebaliknya?
awk
grep
performance
cut
Networker
sumber
sumber
echo filename
ataucat filename
?Jawaban:
Perbedaan paling menonjol antara dua baris Anda akan tergantung pada input.
cut
mengambil satu karakter-d
sebagai pembatas bidang (standarnya adalah TAB), dan setiap kemunculan karakter tersebut memulai bidang baru.awk
Namun, lebih fleksibel. Pemisah dalamFS
variabel dan dapat berupa string kosong (setiap karakter input membuat bidang terpisah), satu karakter, atau ekspresi reguler. Kasus khusus karakter spasi tunggal (default) berarti untuk membagi pada urutan spasi putih apa pun . Juga,awk
menekan spasi putih terkemuka secara default.Silakan bandingkan:
Di sini,
awk
terbagi pada urutan ruang antaraabc
dandef
sementaracut
mengambil setiap ruang sebagai pemisah.Apa yang Anda ambil akan tergantung pada apa yang ingin Anda capai. Kalau tidak, saya akan berharap
cut
untuk menjadi lebih cepat karena itu adalah alat yang lebih kecil, tujuan tunggal sedangkanawk
memiliki bahasa pemrograman sendiri.sumber
cut
kemungkinan lebih cepat dari Awk saja , tetapi tidak begitu pasti bahwagrep ... | cut
akan lebih cepat dari Awk murni.Secara umum, semakin khusus suatu alat, semakin cepat itu. Jadi dalam kebanyakan kasus, Anda bisa berharap
cut
dangrep
menjadi lebih cepat daripadased
, dansed
lebih cepat daripadaawk
. Jika Anda mengimbangi pipeline yang lebih panjang dari alat yang lebih sederhana dengan satu permintaan alat yang lebih kompleks, tidak ada aturan praktis. Ini hanya masalah dengan input besar (katakanlah, jutaan baris); untuk input pendek, Anda tidak akan melihat perbedaan.Keuntungan dari alat yang lebih kompleks tentu saja mereka dapat melakukan lebih banyak hal.
Perintah Anda menggunakan kucing tidak perlu. Gunakan pengalihan saja (terutama jika Anda khawatir tentang kecepatan, meskipun Anda mungkin tidak perlu khawatir tentang kecepatan sampai Anda menjalankan benchmark run).
Perintah-perintah ini hampir setara. Perbedaannya adalah:
grep -E
memiliki sintaks regexp yang hampir sama (ekspresi reguler yang diperluas).cut -d ' '
memperlakukan setiap karakter ruang individu sebagai pembatas. Pembatas default awk adalah setiap urutan spasi putih, yang dapat berupa beberapa spasi, tab, dll. Anda tidak dapat menggunakan urutan spasi putih acak sebagai pemisah dengancut
. Untuk menggunakan ruang individu sebagai pemisah di awk, mengatur pemisah lapangan untuk regexp yang cocok satu ruang, selain regexp yang terdiri dari satu ruang (yang merupakan kasus khusus yang berarti “setiap spasi urutan”, yaitu default):awk -F '[ ]' '/WORD/ {print $2}'
.¹ Aturan Pertama Optimalisasi Program: Jangan lakukan itu. Aturan Kedua tentang Pengoptimalan Program (hanya untuk para ahli!): Jangan lakukan itu dulu. - Michael A. Jackson
sumber
Perintahmu,
Anda bahkan tidak memerlukan
cat
perintah. Anda dapat mencoba,Dan perintah di bawah ini mengalihkan output dari kucing ke grep lalu memotong,
Kemungkinan besar kita harus menghindari redirection output. Awk melakukan pekerjaan dalam satu baris tetapi
cut
membutuhkangrep
perintah untuk mendapatkan hanya baris yang berisi kata tertentu dan mencetak kolom 2 sesuai dengan ruang pembatas.Anda dapat melakukan hal-hal dalam awk jika pemotongan gagal dilakukan.
sumber
grep WORD filename
.