Các awkgiải pháp đơn giản :
Giả sử rằng biểu thức chính quy được sử dụng để tìm các dòng phù hợp được lưu trữ trong biến shell $regexvà số dòng cần bỏ qua $count.
Nếu dòng phù hợp cũng nên được bỏ qua ( $count + 1các dòng bị bỏ qua):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Nếu dòng đối sánh không được bỏ qua ( $countcác dòng sau khi đối sánh bị bỏ qua):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Giải trình:
-v regex="$regex" -v count="$count"định nghĩa awkcác biến dựa trên các biến shell cùng tên.
$0 ~ regex phù hợp với dòng quan tâm
{ skip=count; next }khởi tạo số lần bỏ qua và chuyển sang dòng tiếp theo, bỏ qua dòng phù hợp một cách hiệu quả; trong giải pháp thứ 2, printtrước đó nextđảm bảo rằng nó không bị bỏ qua.
--skip >= 0 giảm số lần bỏ qua và thực hiện hành động nếu nó (vẫn)> = 0, ngụ ý rằng dòng ở tay nên được bỏ qua.
{ next } chuyển sang dòng tiếp theo, bỏ qua dòng hiện tại một cách hiệu quả
1là một cách viết tắt thường được sử dụng cho { print }; nghĩa là dòng hiện tại được in đơn giản
- Chỉ các dòng không khớp và không bị bỏ qua mới đạt được lệnh này.
- Lý do
1tương đương với { print }nó 1được hiểu là một mẫu Boolean mà theo định nghĩa luôn đánh giá là true, có nghĩa là hành động liên quan (khối) của nó được thực thi vô điều kiện. Vì không có hành động liên quan nào trong trường hợp này, awkmặc định là in dòng.
+Nmẫu là một phần mở rộng GNU. Thay đổi đầu tiênnthành mộtNtrong ví dụ thứ hai của bạn để làm cho nó bao gồm đường với mẫu.