Dengan sed
Anda bisa melakukan sliding window.
sed '1N;$!N;/141.299.99.1/P;D'
Itu berhasil. Tapi waspadalah - bash
perilaku gila ekspansi !
bahkan ketika dikutip !!! ke dalam string perintah dari sejarah perintah Anda mungkin membuatnya sedikit gila. Awali perintah dengan set +H;
jika Anda menemukan ini masalahnya. Untuk kemudian mengaktifkannya kembali (tapi mengapa ???) lakukan set -H
sesudahnya.
Itu, tentu saja, hanya akan berlaku jika Anda sedang menggunakan bash
- meskipun saya tidak percaya Anda. Saya cukup yakin Anda bekerja dengan csh
- (yang kebetulan shell yang perilaku gila bash
ditiru dengan ekspansi sejarah, tapi mungkin tidak terlalu ekstrem shell c mengambilnya) . Jadi mungkin suatu \!
harus bekerja. Saya harap.
Ini semua kode portabel: POSIX menjelaskan tiga operatornya sebagai berikut: (meskipun perlu dicatat bahwa saya hanya mengonfirmasi deskripsi ini sudah ada sejak tahun 2001)
[2addr]N
Tambahkan baris input berikutnya, kurang garis \n
putusnya, ke ruang pola, menggunakan garis \n
tepi tertanam untuk memisahkan bahan yang ditambahkan dari bahan asli. Perhatikan bahwa nomor baris saat ini berubah.
[2addr]P
Tulis ruang pola, hingga baris pertama \n
, ke output standar.
[2addr]D
Hapus segmen awal ruang pola melalui baris pertama \n
dan mulai siklus berikutnya.
Jadi pada baris pertama Anda menambahkan garis ekstra ke ruang pola, sehingga terlihat seperti ini:
^line 1s contents\nline 2s contents$
Kemudian pada baris pertama dan setiap baris sesudahnya - kecuali yang terakhir - Anda menambahkan baris lain ke ruang pola. Jadi sepertinya ini:
^line 1\nline 2\nline 3$
Jika alamat ip Anda ditemukan di dalam diri Anda P
hingga baris baru pertama, maka cukup baris 1 di sini. Di akhir setiap siklus, Anda D
mengelakan hal yang sama dan memulai kembali dengan yang tersisa. Jadi siklus selanjutnya terlihat seperti:
^line 2\nline 3\nline 4$
...dan seterusnya. Jika ip Anda dapat ditemukan pada salah satu dari tiga yang tertua akan dicetak - setiap saat. Jadi, Anda selalu hanya tiga baris di depan.
Ini contoh singkatnya. Saya akan mencetak buffer tiga baris untuk setiap angka yang diakhiri dengan nol:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Yang itu sedikit lebih rumit daripada kasus Anda karena saya harus berganti dari 0\n
baris baru atau0$
akhir pola ruang untuk lebih mirip masalah Anda - tetapi mereka agak berbeda dalam hal ini membutuhkan jangkar - yang dapat sedikit sulit dilakukan karena pola-ruang terus bergeser.
Saya menggunakan kasus aneh 10 dan 52 untuk menunjukkan bahwa selama jangkar fleksibel maka outputnya juga. Sepenuhnya mudah dibawa, saya dapat mencapai hasil yang sama dengan mengandalkan algoritma dan melakukan:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
Dan memperluas pencarian sambil membatasi jendela saya - dari 0 hingga 9 dan 0 dan dari 3 baris menjadi dua.
Bagaimanapun, Anda mendapatkan idenya.