đuôi -f, nhưng với số dòng


21

Tôi đang cố gắng xem có bao nhiêu lần foo barxuất hiện /var/log/foo.logtrong một khoảng thời gian tùy ý trên một máy chủ từ xa, nhưng không có gì mà tôi đã thử cho đến nay đã hoạt động.

Tôi đã có một tập lệnh hẹn giờ mà tôi sử dụng để theo dõi xem nó đã tồn tại bao lâu kể từ khi tôi bắt đầu theo đuôi /var/log/foo.log, và bây giờ tôi giống như một cách để biết bao nhiêu lần foo barđã xuất hiện trong đầu ra đuôi.

Tôi đã tìm kiếm google, nhưng tôi không tìm thấy bất cứ điều gì thích hợp trong vòng 10 trang đầu tiên của kết quả.

Đây là những gì tôi đã thử với kết quả bực bội:

## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='

## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -

##  works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'

Tôi thậm chí đã cố gắng viết một kịch bản sed mà hành động như thế tail -f, nhưng tôi đã giới hạn không có gì với nó.

CHÚ THÍCH

máy chủ từ xa đang chạy phiên bản lõi cũ hơn và nâng cấp là một tùy chọn, nhưng KHÔNG phải là giải pháp mong muốn.


2
Nó không hoạt động theo cách nào? Hãy thử --line-bufferedtùy chọn để grep. Hoặctail -f ... | awk '/foo bar/{print ++n, $0}'
Stéphane Chazelas

Tại sao nó không hoạt động trên remote? Ví dụ:tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'

Câu trả lời:


29
tail -f | nl

làm việc cho tôi và là điều đầu tiên tôi nghĩ đến - đó là nếu bạn thực sự muốn các dòng được đánh số từ 1 chứ không phải với số dòng thực từ tệp được xem. Tùy chọn thêm grepnếu cần đến nơi thích hợp (trước hoặc sau nl). Tuy nhiên, hãy nhớ rằng bộ đệm có thể xảy ra. Trong trường hợp cụ thể của tôi, grep--line-bufferedtùy chọn, nhưng nlbộ đệm là đầu ra và không có tùy chọn để tắt. Do đó, tail | nl | grepcombo không thực sự chảy độc đáo.

Mà nói,

tail -f | grep -n pattern

làm việc cho tôi là tốt. Việc đánh số bắt đầu lại từ đầu "đuôi" thay vì bắt đầu toàn bộ tệp nhật ký.


phiên bản grep chạy trên máy chủ không có -ntùy chọn.
Alexej Magura

tuy nhiên, nó có tùy chọn dài --line-number: tail -f /var/log/foo.log | grep foo\ bar --line-numberhoạt động!
Alexej Magura

1
Điều đó thật thú vị - Tôi đã không kiểm tra POSIX như vậy, nhưng trang web GNU grep nói: -n được chỉ định bởi POSIX .
peterph

16

Tôi nghĩ rằng điều này là tốt hơn ..

less -N +F <filepath>

2
Bạn có thể giải thích tại sao bạn nghĩ nó tốt hơn?
Navigatron

Đây là một chỉnh sửa lớn, tôi đang hoàn nguyên.
Adam Eberlin

3
Hiển thị số dòng lấy tham chiếu toàn bộ tệp. đuôi -f | nl hiển thị số dòng lấy tham chiếu đầu ra đầu tiên của đuôi.
rafaelvalle

Điều này rất tiện dụng và giải quyết Tiêu đề của OP nhưng không phải là câu hỏi của họ . Họ muốn biết X xuất hiện bao nhiêu lần trong một tệp: P
Timmah

6

Bạn cũng có thể dẫn đầu ra less, nó có tính năng số dòng, -Ncho phép bạn cuộn qua lại thông qua nhật ký.

$ tail -f /var/log/foo.log | less -N

Thí dụ

  1 Jan 17 22:11:58 greeneggs fprintd[4323]: ** Message: entering main loop
  2 Jan 17 22:12:01 greeneggs su: (to root) saml on pts/5
  3 Jan 17 22:12:28 greeneggs fprintd[4323]: ** Message: No devices in use, exit
  4 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Git | personal_repo | Checking for remote changes...
  5 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git rev-parse HEAD
  6 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git ls-remote --heads --exit-code "ssh://sam@sparkleshare.jake      
  6 8us.org/home/sam/SparkleShare/personal_repo.git" master
  7 Jan 17 22:12:58 greeneggs gnome-session[1876]: X11 forwarding request failed on channel 1
  8 Jan 17 22:12:58 greeneggs gnome-session[1876]: 22:12:58 | Git | personal_repo | No remote changes, local+remote: 532213be48cce3b93cb177d409faa      
  8 03b71d0cfa5
  9 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Pinging tcp://notifications.sparkleshare.org:443/
 10 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Received pong from tcp://notifications.sparkleshare.org:443/

LƯU Ý: Hãy chú ý đến đầu ra. Bạn có thể hoặc không thể thích tính năng này, nhưng nó sẽ mất nhiều dòng và cắt chúng để chúng tiếp tục ở dòng tiếp theo, nhưng vẫn duy trì cùng số dòng tương ứng. Tôi thấy tính năng này là vô giá khi phân tích tệp nhật ký rộng! Bạn có thể thấy tác dụng của tính năng này trên các dòng 6 & 8 .


Điều này không rõ ràng. Tên tệp được chỉ định ở đâu? Cần làm rõ, lưu ý rằng đầu ra được đánh số từ 1 bắt đầu bằng 10 dòng cuối cùng của tên tệp, vì đó là hành vi mặc định của tail. Đối với các dòng dài, hành vi đó được bật trong khi lesssử dụng -S.
ILMostro_7

2

Để grep các dòng mới chỉ trong tệp nhật ký khi chúng đi kèm với số dòng của chúng, bạn có thể làm:

{
  initial_lines=$(wc -l)
  tail -n +1 -f | awk -v NR="$initial_lines" '/pattern/{print NR": "$0}'
} < file.log

(với mawk, bạn sẽ muốn thêm -Winteractivetùy chọn để ngăn bộ đệm đầu vào (!) của nó .

wc -lđọc các dòng đã có ở đó và đếm chúng (các ký tự dòng mới có nghĩa là nó vẫn hoạt động ngay cả khi dòng cuối cùng chưa đầy), và sau đó chúng tôi tail -fphần còn lại (bắt đầu từ nơi wcdừng đọc) và cho biết awksố dòng là gì cái đầu tiên nó nhìn thấy.


chọn llàm tên biến khiến tôi nheo mắt nhìn $ l, nghĩ rằng đó là $1^^ (nhưng như tôi biết (và tin tưởng 100%) bạn, tôi đọc lại và thấy sự thật). Chỉ vì tò mò: để tránh một số "điều kiện chủng tộc" giữa wc -ltail -f(nếu tệp phát triển nhanh, người ta có thể loại bỏ một số dòng và do đó NR bắt đầu từ số sai), $lthay vào đó có thể bỏ qua các dòng không? (và giới hạn nào là có đuôi -ntrong tư thế & trong gnu?). Có thể với một tập tin trung gian tạm thời?
Olivier Dulac

@OlivierDulac, tail -n +1(đọc bất cứ điều gì từ vị trí bắt đầu) giải quyết các mối quan tâm về điều kiện cuộc đua. Nó sẽ đọc các dòng không có trong tệp tại thời điểm wc -lkết thúc, từ vị trí chính xác wccòn lại nó. Vì vậy, NR sẽ có vị trí phù hợp bất kể có bao nhiêu dòng đã được viết ở giữa wckết thúc và tailbắt đầu. Đó là nếu bạn được yêu tailcầu bắt đầu từ một số vị trí liên quan đến phần cuối của tệp mà bạn gặp sự cố.
Stéphane Chazelas

oh, xen kẽ: thực sự, dữ liệu tích lũy vào stdin trong khi không có gì đọc nó (giữa cuối wc cho đến khi bắt đầu) ... Tôi nên nhận ra điều đó. Cám ơn. Bây giờ tôi thấy lý do tại sao bạn "<file". thông minh, như thường lệ :)
Olivier Dulac

1
@OlivierDulac, về các giới hạn (không áp dụng tail -n +1ở đây), đối với các tệp thông thường, hầu hết các triển khai không có một vì chúng có thể bắt đầu từ cuối và seektrở lại cho đến khi chúng tìm thấy dòng mới thứ n mà không phải lưu trữ nhiều hơn một giá trị buf dữ liệu trong bộ nhớ. Đối với đầu vào không thể tìm kiếm, đó là nơi bạn có thể chạy vào giới hạn. POSIX yêu cầu triển khai để có thể lưu trữ ít nhất 10 x LINE_MAX byte (LINE_MAX ít nhất là 2048). Đuôi GNU không có giới hạn nào ngoài bộ nhớ AFAIK
Stéphane Chazelas

0

Nếu bạn muốn đánh số từ đầu, bạn cần grep -n để áp dụng cho tất cả các dòng.

 tail -f -n100000000 filename.log | grep -n '' 

Nếu sau đó bạn chỉ muốn hiển thị 10 cuối tôi đã nghĩ bạn có thể nối lại tệp:

 tail -f -n100000000 filename.log | grep -n '' | tail -n10

Đầu tiên là tiện dụng, nhưng hiển thị quá nhiều đầu ra. Tôi không biết tại sao cái thứ hai không hoạt động.


Tail không có "hiển thị tất cả các dòng" do đó 100000000 của tôi
Martin Cleaver

1
tail -n +1 -fđể đuôi từ đầu.
Stéphane Chazelas

1
Cái thứ hai không hoạt động bởi vì hầu hết bên phải tailkhông thể xuất bất cứ thứ gì cho đến khi nó nhìn thấy dòng cuối cùng của đầu vào (làm sao nó biết dòng thứ 10 cuối cùng?) Sẽ không bao giờ xảy ra vì tail -fkhông bao giờ dừng lại.
Stéphane Chazelas

-1

Lệnh cat -n [filename] | tailsẽ đếm nhanh và hiển thị các bản ghi gần đây nhất nếu đó là thứ bạn đang tìm kiếm.

Công -ftắc làm cho nó bền bỉ cho đến khi thoát - điều thực sự không có âm thanh áp dụng trong kịch bản của bạn hoặc là dư thừa.

wc -l [filename] sẽ nhận được số lượng các dòng trong mục tiêu

wc -l [filenameprefix]* sẽ đếm tất cả các dòng trong tất cả các tệp khớp với mẫu và thậm chí báo cáo tổng số tóm tắt ở cuối.

Chi tiết đầy đủ hơn có thể mang lại phản ứng đầy đủ hơn.


-1

Đó là đối số nhoặc --lines(được sử dụng theo những cách hơi khác nhau, xem bên dưới):

$ tail -f -n 25 /path/to/file.txt

$ tail -f --lines=25 /path/to/file.txt

Xem thêm sự giúp đỡ:

$ tail --help

1
OP muốn số dòng, không phải một số dòng.
robbat2
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.