Basit awk
çözümler:
Eşleşen satırları bulmak için kullanılacak normal ifadenin kabuk değişkeninde $regex
ve atlanacak satır sayısında depolandığını varsayın $count
.
Eğer uygun hattı gerekir da atlanır ( $count + 1
hat atlanır):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Eğer eşleşen bir satır olmalıdır değil atlanır ( $count
çizgiler sonra maçın atlanır):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Açıklama:
-v regex="$regex" -v count="$count"
awk
Değişkenleri aynı isimli kabuk değişkenlerine göre tanımlar .
$0 ~ regex
ilgi alanıyla eşleşir
{ skip=count; next }
atlama sayısını başlatır ve bir sonraki satıra geçerek eşleştirme satırını etkin bir şekilde atlar; 2 çözümde, print
daha önce next
olmasını sağlar o olduğunu değil atlanır.
--skip >= 0
atlama sayısını azaltır ve eğer (hala)> = 0 ise, eldeki satırın atlanması gerektiği anlamına gelir.
{ next }
etkin bir şekilde geçerli satırı atlayarak sonraki satıra geçer
1
için yaygın olarak kullanılan bir kısaltmadır { print }
; yani mevcut satır basitçe yazdırılır
- Bu komuta yalnızca eşleşmeyen ve atlanmayan satırlar ulaşır.
- Nedeni
1
eşdeğerdir { print }
yani 1
tanım gereği her zaman (blok) ilişkili işlem koşulsuz olarak yürütülür, bu vasıtalar, doğru olarak değerlendirilir bir Boolean model yorumlanır. Yana orada olduğu hiçbir bu durumda ilişkili eylem, awk
varsayılan baskı hattı.
+N
bir GNU uzantısı olduğuna dikkat edin . Desenli çizgiyi içermesini sağlamak için ikinci örneğinizde ilkini birn
ile değiştirinN
.