Saya memiliki daftar panjang alamat IP, yang tidak berurutan. Saya perlu menemukan berapa banyak alamat IP yang ada sebelum / sesudah alamat IP tertentu. Bagaimana saya bisa mencapai ini?
shell-script
text-processing
Mandar Shinde
sumber
sumber
Jawaban:
Jumlah baris sebelum dan sesudah pertandingan, termasuk pertandingan (yaitu Anda harus mengurangi 1 dari hasil jika Anda ingin mengecualikan pertandingan):
Tetapi ini tidak ada hubungannya dengan alamat IP pada khususnya.
sumber
Mungkin yang paling mudah adalah,
Terima kasih @ JoshepR untuk menunjukkan kesalahan
sumber
dc
, saya sendiri, mungkin.Saya melakukan dua cara ini, meskipun saya pikir saya paling suka ini:
Itu menyimpan semua itu sebagai variabel shell saat ini - dan mengevaluasi mereka dalam for for loop kemudian untuk output. Itu menghitung total baris dalam file dengan
wc
dan mendapat nomor baris pertama yang cocok dengannyased
.Keluarannya:
Saya juga melakukan:
sed
hanya mencetak nomor baris yang cocok dan terakhir, kemudiantr
menerjemahkan\n
ewlines yang akan diintervensi, danread
membaca hasil pertamased
ke dalam$ml
dan semua yang lain ke dalam$ll
. Beberapa kasus pencocokan mungkin ditangani dengan melepaskan semua kecuali hasil terakhir dari$ll
ekspansi saat mengaturnya kembali nanti.Keluarannya:
Kedua metode diuji pada file yang dihasilkan dengan cara berikut:
Ya, dengan nomor baris:
"$IP"
kemudian\n
ewlinetr
- yang menerjemahkan nol ke\n
ewlines lalu ke~/file
sumber
Berikut sedikit kode Perl yang melakukannya:
Ini menghitung jumlah total baris sebelum dan sesudah baris yang berisi IP
192.168.1.1
. Ganti dengan IP yang Anda inginkan.Hanya menggunakan Bash:
sumber
$.
konter?$after
untuk$. - $before
.$. - 1
, simpan$.
ke$tmp
. Cetak akhir$. - $tmp
. Jadi kita tidak perlu kontra untuk sebelum dan sesudah. Tentu saja itu kurang mudah dibaca daripada milik Anda.Saya mencoba perintah berikut, yang sedikit rumit, tetapi akan memberikan hasil yang akurat:
Setelah:
Sebelum:
sumber
Sebuah
awk
solusi melaporkan jumlah baris sebelum dan setelah pertandingan terakhirsumber
Grep
memiliki fitur yang dapat menghitung berapa kali pola tertentu ditemukan. Jika Anda menggunakan-c
perintah yang akan melakukannya. Dengan-c
dan-v
perintah, ini akan menghitung berapa kali ini tidak cocok dengan pola tertentuContoh:
grep -c -v <pattern> file
Jadi, jika Anda mencoba sesuatu seperti:
grep -c -v 192.168.x.x file.log
itu seharusnya bekerja.sumber