Diberikan file log, saya biasanya akan melakukan sesuatu seperti ini:
grep 'marker-1234' filter_log
Apa perbedaan menggunakan '' atau "" atau tidak sama sekali dalam polanya?
Perintah grep di atas akan menghasilkan ribuan baris; apa yang saya inginkan. Di dalam baris-baris itu, Biasanya ada satu potong data yang saya cari. Terkadang, saya menggunakan awk untuk mencetak bidang yang saya cari. Dalam hal ini, format log berubah, saya tidak bisa bergantung pada posisi secara eksklusif, belum lagi, data log aktual dapat mendorong posisi ke depan.
Untuk membuat hal ini dapat dimengerti, katakanlah baris log berisi alamat IP, dan hanya itu yang saya cari, jadi saya nanti dapat memipkannya untuk mengurutkan dan unik dan mendapatkan beberapa hitungan penghitungan.
Contohnya mungkin:
2010-04-08 some logged data, indetermineate chars - [marker-1234] (123.123.123.123) from: [email protected] to [email protected] [stat-xyz9876]
Perintah grep pertama akan memberi saya ribuan baris seperti di atas, dari sana, saya ingin menyalurkannya ke sesuatu, mungkin sed
, yang dapat menarik pola di dalam, dan hanya mencetak pola.
Untuk contoh ini, cukup menggunakan alamat IP. Saya mencoba. Aku s sed
tidak dapat mengerti [0-9] {1,3}. sebagai sebuah pola? Saya harus [0-9] [0-9] [0-9]. yang menghasilkan hasil aneh sampai seluruh pola dibuat.
Ini tidak spesifik untuk alamat IP, polanya akan berubah, tapi saya bisa menggunakannya sebagai templat pembelajaran.
Terima kasih semua.
Jawaban:
Saya tidak tahu OS apa yang Anda gunakan, tetapi pada FreeBSD 7.0+ grep memiliki
-o
pilihan untuk mengembalikan hanya bagian yang cocok dengan pola. Jadi kamu bisagrep "marker-1234" filter_log | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
Mengembalikan daftar alamat IP yang adil dari 'filter_log "...
Ini berfungsi pada sistem saya, tetapi sekali lagi, saya tidak tahu apa yang didukung versi grep Anda.
sumber
Anda dapat melakukan semua ini hanya dalam satu
awk
perintah. Tidak perlu menggunakan alat lainsumber
Anda dapat mempersingkat yang kedua
grep
sedikit seperti ini:Untuk menjawab pertanyaan pertama Anda, tanda kutip ganda memungkinkan shell untuk melakukan berbagai hal seperti ekspansi variabel, tetapi melindungi beberapa karakter meta dari kebutuhan untuk melarikan diri. Kutipan tunggal mencegah shell melakukan ekspansi tersebut. Tidak menggunakan tanda kutip membuat semuanya terbuka lebar.
Anda dapat mempelajari lebih lanjut di bagian "QUOTING" di
man bash
sumber
IFS
dan pulihkan sesegera mungkin:saveIFS="$IFS"; IFS=","; do_something; IFS="$saveIFS"; do_other_stuff
Lihatlah
xargs
perintah. Anda harus dapat melakukan sesuatu seperti:Ini mungkin bukan tepatnya, tetapi
xargs
adalah perintah yang ingin Anda gunakansumber