Lệnh Shell để theo dõi các thay đổi trong một tệp - Nó được gọi lại là gì?


159

Tôi biết có một lệnh trên Unix mà tôi có thể sử dụng để theo dõi một tệp và xem các thay đổi đang được ghi vào nó. Điều này khá hữu ích đặc biệt là để kiểm tra các tệp nhật ký.

Bạn có biết nó được gọi là gì không?

Câu trả lời:


213

Ý bạn là

tail -f logfile.log

?

( Trang nam cho đuôi )


6
Vâng, đó là thời gian thực.
Adam Gibbins

18
Sidenote: Nếu bản phân phối của bạn cung cấp lệnh tailf, hãy sử dụng tùy chọn đó để tail -f. tailf hiệu quả hơn vì không cần truy cập vào tệp đã xem nếu nó không được ghi vào (truy cập thăm dò ý kiến ​​gây phiền nhiễu nếu bạn gắn hệ thống tệp với cập nhật atime.)
Mihai Limbăşan

10
Tại siêu người dùng, tôi đã tìm thấy một câu trả lời đề xuất đuôi -F thay vì -f , quá
Rafa

17
tail -Fsẽ theo tên tệp thay vì các đối tượng tệp, đặc biệt hữu ích trong trường hợp xoay tệp nhật ký.
Amir Ali Akbari

2
Cập nhật, một vài năm sau: tailfhiện không dùng nữa và tail -fan toàn. (xác nhận điều này trên hệ thống của bạn với man tailf.) Xem tài liệu: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

Bạn có thể có nghĩa là đuôi, theo câu trả lời của Jon Skeet.

Một cái hữu ích khác là đồng hồ ; nó cho phép bạn chạy một lệnh định kỳ và xem toàn màn hình đầu ra. Ví dụ:

xem -n 10 -d ls -l / var / adm / tin nhắn

Sẽ chạy lệnh ls -l /var/adm/messagessau mỗi 10 giây và làm nổi bật sự khác biệt về đầu ra giữa các lần chạy tiếp theo. (Hữu ích để xem tốc độ phát triển của một logfile chẳng hạn).


38

inotifywaittừ inotify-tools rất hữu ích nếu bạn muốn chạy lệnh mỗi khi tệp (hoặc bất kỳ tệp nào trong thư mục) thay đổi. Ví dụ:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

Chỉ cần một lưu ý rằng pathkhông phải là sự lựa chọn lớn nhất cho một tên biến. Trên zsh, có vẻ như các vars môi trường không phân biệt chữ hoa chữ thường. Đối với tôi, cài đặt pathnguyên nhân PATHcũng được thiết lập và điều đó về cơ bản có nghĩa là không có gì sẽ thực thi cho đến khi bạn khắc phục điều đó. Bật bash, cài đặt pathkhông có hiệu lực trên PATH.
Thanatos

36

Tôi thích sử dụng hơn less +FG1tail -f vì tôi thấy mình cần tìm kiếm tệp nhật ký cho một lỗi hoặc ID cụ thể. Nếu tôi cần tìm kiếm thứ gì đó, tôi gõ ^Cđể dừng theo dõi tệp và ?bắt đầu tìm kiếm ngược.

Các ràng buộc chính là khá nhiều như trong vi. Bất kỳ lệnh nào cũng có thể được khởi tạo khi khởi động bằng +tùy chọn:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Đối với các bản ghi thực sự dài, tôi thấy thuận tiện khi sử dụng -ntùy chọn tắt đánh số dòng. Từ trang hướng dẫn:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Hat-tip to rgmarcha vì đã chỉ ra điều này trong các bình luận.


Hãy nhớ đặt một aliastùy chọn mong muốn của bạn, vì vậy bạn không cần phải gõ chúng ra mỗi lần.
Michael Hampton

Trên thực tế, bạn thường thích các hàm shell hơn các bí danh trong hầu hết các trường hợp.
tripleee

21

Đuôi là tuyệt vời ... ít hơn cũng có thể được sử dụng bắt đầu ít hơn trên tệp tức là ít myfile sau đó nhấn Shift+ F. Điều này có ít hoạt động như đuôi.


5
ít hơn + F myfile cũng sẽ làm được
rgmarcha

16

Tôi đang chỉnh sửa tệp LaTeX và cũng muốn theo dõi nó để biết những thay đổi ở đâu đó ở giữa. Tôi đã đánh dấu kịch bản shell nhỏ sau đây tỏ ra hữu ích với tôi. Tôi hy vọng nó cũng sẽ có ích cho người khác.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Lưu nó như watch.shvà làm chmod u+x watch.sh. Sau đó, tôi thực hiện nó như sau:

./watch.sh file.tex pdflatex

Nếu bạn muốn lệnh chỉ được chạy nếu sửa đổi thực tế diễn ra, bạn có thể sử dụng `md5sum "$FILE"`thay vì `ls -l "$FILE"`.


1
để xem các thư mục và nội dung của chúng thay vì một tệp duy nhất:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

Bạn cũng có thể sử dụng inotifywatch / inotifywait mà hook vào hạt nhân hệ thống con inotify. Bằng cách này, bạn cũng có thể xem những thứ như "mở", "đóng" hoặc "truy cập".

Nhưng nếu bạn chỉ đơn giản muốn nhận các dòng được nối vào thiết bị xuất chuẩn thì tôi đồng ý theo đuôi.


3

Đuôi là tiêu chuẩn, truyền thống, có sẵn ở khắp mọi nơi công cụ unix. Một chút công cụ phức tạp hơn là multitail có thể giám sát nhiều file cùng một lúc và làm nổi bật cú pháp.


3

Nếu tôi muốn có thể tìm kiếm xung quanh tệp ngoài việc chỉ theo đuôi nó, tôi sử dụng ít hơn với lệnh "F".

Khi sử dụng đuôi, hãy nhớ rằng các đối số bổ sung là cần thiết nếu tệp có thể được cuộn qua hoặc thay thế bằng chỉnh sửa (chế độ mặc định cho vim's: w).

tail -f sẽ khiến đuôi lưu trữ bộ mô tả tệp và làm theo nó. Nếu tập tin được thay thế, bộ mô tả sẽ được thay đổi. Lợi ích của việc theo dõi bộ mô tả tệp là nếu tệp được đổi tên, bạn vẫn sẽ theo dõi nó.

tail --follow = sẽ làm cho đuôi theo dõi tệp được đặt tên bằng cách mở lại định kỳ để xem nó đã được thay thế chưa.

--retry là một tùy chọn hữu ích khác nếu bạn muốn theo dõi tệp nhật ký nhưng tệp chưa được tạo.

đuôi -F là một phím tắt cho --follow = --retry.


2

Quên tailf, diff là lệnh bạn muốn. Đây là một mẹo hay để xem sự khác biệt khi chúng xảy ra trong thời gian thực (hoặc đóng) giữa 2 tệp hoặc trong một tệp được ghi vào.

Bạn có thể sử dụng các phương pháp này để sửa đổi hành vi theo bất kỳ cách nào bạn muốn, chẳng hạn như viết các thay đổi vào một tệp để lưu giữ hồ sơ. Chơi xung quanh với khoảng thời gian của đồng hồ hoặc các tùy chọn khác cho các lệnh bên dưới.

Bạn có 1 tệp và bạn muốn xem những thay đổi được thực hiện cho nó:

Vì vậy, đây là những gì để làm:

  1. sao chép tập tin

cp file file2

  1. viết một tập lệnh bash để tìm sự khác biệt và cập nhật tập tin2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Đây là một ý tưởng cơ bản cho kịch bản. Làm cho nó ghi vào một tập tin nếu bạn muốn

#!/bin/bash

diff file file2

cp file file2

  1. Tiếp theo, bạn có thể xem sự khác biệt trên màn hình bằng đồng hồ

watch ./check-differences

cái này sẽ cập nhật cứ sau 2 giây. Vì vậy, nếu bạn cần quay lại và đọc chúng, sau đó ghi đầu ra của diff vào một tệp trong tập lệnh.

hoặc sử dụng cron để chạy tập lệnh của bạn thường xuyên nếu bạn không cần xem đầu ra.


1

Trong khi tail -f somefile.txttiếp tục cuộn với dữ liệu mới, đôi khi tôi cũng thích less +G somefile.txtnhìn vào một bản vá dữ liệu mới nhất trong tệp.


4
Tôi nghĩ rằng tất cả được bao phủ trong câu trả lời này từ 7 năm trước.
kasperd
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.