Với sed
bạn có thể làm một cửa sổ trượt.
sed '1N;$!N;/141.299.99.1/P;D'
Nó làm điều đó. Nhưng hãy cẩn thận - bash
hành vi điên rồ của việc mở rộng !
ngay cả khi được trích dẫn !!! vào chuỗi lệnh từ lịch sử lệnh của bạn có thể làm cho nó trở nên hơi điên rồ. Tiền tố lệnh vớiset +H;
nếu bạn thấy đây là trường hợp. Để sau đó kích hoạt lại nó (nhưng tại sao ???) làm set -H
sau đó.
Điều đó, tất nhiên, sẽ chỉ áp dụng nếu bạn đang sử dụng bash
- mặc dù tôi không tin là bạn. Tôi khá chắc chắn rằng bạn đang làm việc với csh
- (đó là cái vỏ có hành vi điên rồ bash
mô phỏng với việc mở rộng lịch sử, nhưng có lẽ không phải là cực đoan mà vỏ c đã lấy nó) . Vì vậy, có lẽ là một \!
nên làm việc. Tôi hi vọng.
Đó là tất cả mã di động: POSIX mô tả ba nhà khai thác của nó do đó: (mặc dù đáng lưu ý rằng tôi chỉ xác nhận mô tả này tồn tại vào đầu năm 2001)
[2addr]N
Nối dòng đầu vào tiếp theo, trừ \n
ewline kết thúc của nó vào không gian mẫu, sử dụng \n
ewline nhúng để tách vật liệu được nối với vật liệu ban đầu. Lưu ý rằng số dòng hiện tại thay đổi.
[2addr]P
Viết không gian mẫu, lên đến \n
ewline đầu tiên , đến đầu ra tiêu chuẩn.
[2addr]D
Xóa phân đoạn ban đầu của không gian mẫu thông qua \n
ewline đầu tiên và bắt đầu chu trình tiếp theo.
Vì vậy, trên dòng đầu tiên bạn thêm một dòng bổ sung vào không gian mẫu, vì vậy nó trông như thế này:
^line 1s contents\nline 2s contents$
Sau đó, trên dòng đầu tiên và mỗi dòng sau đó - ngoại trừ dòng cuối cùng - bạn thêm dòng khác dòng vào không gian mẫu. Vì vậy, nó trông như thế này:
^line 1\nline 2\nline 3$
Nếu địa chỉ IP của bạn được tìm thấy trong bạn P
cho đến dòng mới đầu tiên, vì vậy chỉ cần dòng 1 ở đây. Vào cuối mỗi chu kỳ, bạn D
bắt đầu giống nhau và bắt đầu lại với những gì còn lại. Vì vậy, chu kỳ tiếp theo trông như sau:
^line 2\nline 3\nline 4$
...và như thế. Nếu ip của bạn được tìm thấy trên bất kỳ một trong ba cái cũ nhất sẽ in ra - mọi lúc. Vì vậy, bạn luôn luôn chỉ có ba dòng phía trước.
Đây là một ví dụ nhanh. Tôi sẽ nhận được bộ đệm ba dòng được in cho mỗi số kết thúc bằng 0:
seq 10 52 | sed '1N;$!N;/0\(\n\|$\)/P;D'
10
18
19
20
28
29
30
38
39
40
48
49
50
Đó là một chút phức tạp hơn trường hợp của bạn bởi vì tôi phải thay thế từ một trong hai 0\n
dòng mới hoặc 0$
cuối không gian mẫu để gần giống với vấn đề của bạn hơn - nhưng chúng khác biệt một cách tinh tế ở chỗ điều này đòi hỏi một cái neo - có thể hơi khó thực hiện vì không gian mô hình liên tục thay đổi.
Tôi đã sử dụng các trường hợp lẻ 10 và 52 để chỉ ra rằng miễn là neo linh hoạt thì đầu ra cũng vậy. Hoàn toàn có thể, tôi có thể đạt được kết quả tương tự bằng cách thay vào đó dựa vào thuật toán và thực hiện:
seq 10 52 | sed '1N;$!N;/[90]\n/P;D'
Và mở rộng tìm kiếm trong khi giới hạn cửa sổ của tôi - từ 0 đến 9 và 0 và từ 3 dòng thành hai.
Dù sao, bạn có được ý tưởng.