Các awk
giả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 $regex
và số dòng cần bỏ qua $count
.
Nếu dòng phù hợp cũng nên được bỏ qua ( $count + 1
cá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 ( $count
cá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 awk
cá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, print
trướ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ả
1
là 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
1
tươ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, awk
mặc định là in dòng.
+N
mẫu là một phần mở rộng GNU. Thay đổi đầu tiênn
thành mộtN
trong ví dụ thứ hai của bạn để làm cho nó bao gồm đường với mẫu.