awk
Solusi sederhana :
Asumsikan bahwa ekspresi reguler yang digunakan untuk menemukan garis yang cocok disimpan dalam variabel shell $regex
, dan jumlah baris yang dilewati $count
.
Jika garis yang cocok juga harus dilewati ( $count + 1
garis dilewati):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Jika baris yang cocok tidak boleh dilewati ( $count
baris setelah pertandingan dilewati):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Penjelasan:
-v regex="$regex" -v count="$count"
mendefinisikan awk
variabel berdasarkan variabel shell dengan nama yang sama.
$0 ~ regex
cocok dengan garis minat
{ skip=count; next }
menginisialisasi penghitungan lompatan dan melanjutkan ke baris berikutnya, secara efektif melompati baris yang cocok; dalam solusi kedua, print
before next
memastikan bahwa itu tidak dilewati.
--skip >= 0
mengurangi jumlah lompatan dan mengambil tindakan jika (masih)> = 0, menyiratkan bahwa garis yang ada harus dilewati.
{ next }
melanjutkan ke baris berikutnya, secara efektif melewati baris saat ini
1
adalah singkatan yang umum digunakan untuk { print }
; artinya, baris saat ini hanya dicetak
- Hanya baris yang tidak cocok dan tidak dilewati yang mencapai perintah ini.
- Alasan yang
1
setara dengan { print }
adalah yang 1
diartikan sebagai pola Boolean yang menurut definisi selalu bernilai true, yang berarti bahwa tindakan (blok) yang terkait dieksekusi tanpa syarat. Karena tidak ada tindakan terkait dalam kasus ini, awk
defaultnya adalah mencetak garis.
+N
polanya adalah ekstensi GNU. Ubah yang pertaman
menjadi anN
dalam contoh kedua Anda untuk membuatnya menyertakan garis dengan pola.