grep và đuôi -f?


28

Có thể thực hiện một tail -f(hoặc tương tự) trên một tập tin, và grepnó cùng một lúc? Tôi sẽ không bận tâm đến các lệnh khác chỉ tìm kiếm loại hành vi đó.

Câu trả lời:


46

Sử dụng GNU tailvà GNU grep, tôi có thể grep a tail -fbằng cú pháp chuyển tiếp thẳng:

tail -f /var/log/file.log | grep search_term

Đây là một giải pháp hoạt động với các triển khai khác của hai tiện ích này, không chỉ là triển khai GNU.
Kusalananda

7

Nó sẽ hoạt động tốt; nói chung, grepsẽ đợi khi chương trình không xuất ra và tiếp tục đọc khi đầu ra xuất hiện, vì vậy nếu bạn thực hiện:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Không có gì xảy ra trong 5 giây, sau đó grep sẽ xuất ra "thử nghiệm" phù hợp, và sau đó năm giây sau nó sẽ thoát khi quá trình đường ống thực hiện


7

Thêm --line-bufferedvào grep, và điều đó có thể làm giảm sự chậm trễ cho bạn. Rất hữu ích trong một số trường hợp.

tail -f foo | grep --line-buffered bar

2
Điều đó hữu ích khi đầu ra của grepkhông đi đến một thiết bị đầu cuối (được chuyển hướng đến một loại tệp khác). bộ đệm dòng là mặc định khi đầu ra đi đến một thiết bị đầu cuối, vì vậy nó sẽ không tạo ra bất kỳ sự khác biệt nào ở đó. Lưu ý rằng tùy chọn đó là cụ thể GNU.
Stéphane Chazelas


2

Tôi thấy tất cả những người này nói rằng nên sử dụng tail -f, nhưng tôi không thích những hạn chế đó! Phương pháp ưa thích của tôi để tìm kiếm tệp trong khi cũng xem các dòng mới (ví dụ: tôi thường làm việc với các tệp nhật ký được nối thêm đầu ra được chuyển hướng của các quy trình được thực hiện định kỳ thông qua các công việc định kỳ) là:

 tail -Fn+0 /path/to/file|grep searchterm

Điều này giả định đuôi GNU và grep. Chi tiết hỗ trợ từ trang quản lý đuôi (GNU coreutils, của tôi là v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Vì vậy, phần đuôi của lệnh của tôi tương đương với tail --follow --retry --lines=+0, trong đó đối số cuối cùng hướng nó bắt đầu từ đầu, bỏ qua các dòng không.


1
tail -f access | awk '/ADD/{print $0}'

Sử dụng ở trên, tôi sử dụng nó thường xuyên.


0

Bạn có thể sử dụng netcat để grep kết quả của đuôi -f vì kết quả mới xuất hiện khá dễ dàng.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Điều này đặt grep để nghe kết quả cho đầu vào đến từ cổng 1337.
Lệnh thứ hai chuyển đầu ra của đuôi -f sang netcat và gửi nó ra localhost 1337. Để thực hiện cục bộ, bạn cần chuyển ttys cho mỗi trong hai bộ lệnh hoặc sử dụng một cái gì đó như màn hình.


0

Nó hoạt động. Nhưng hãy cẩn thận rằng đầu ra không còn tức thời: nó được đệm qua đường ống.


Đã đồng ý. Để kiểm tra điều này, hãy mở hai cửa sổ. Chạy tail -ftrong một cửa sổ, và tail -f logfile | grep patterntrong cửa sổ khác. Các dòng chứa patternkhông luôn xuất hiện trong cả hai cửa sổ cùng một lúc. Tôi đã thấy các dòng xuất hiện cách nhau 30 giây trong những dịp hiếm hoi, thật khó chịu.
Stefan Lasiewski

Điều đó có thể có liên quan nhiều hơn với hệ thống lật giữa chạy một hoặc một trường hợp đuôi khác. Một bài kiểm tra tốt hơn sẽ cho chúng tôi teehoặc một cái gì đó.
Kevin Cantu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.