it-swarm-vi.tech

Lệnh Shell để theo dõi các thay đổi trong một tệp

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?

167
Sebastian Hoitz

Ý bạn là

tail -f logfile.log

?

( Trang nam cho đuôi )

220
Jon Skeet

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à xem ; 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/messages[.__.]

Sẽ chạy lệnh ls -l /var/adm/messages cứ sau 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).

128
Murali Suriar

inotifywait from 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
42
richvdh

Tôi thích sử dụng less +FG1 kết thúc tail -f bởi vì tôi thấy mình cần tìm kiếm một 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 khá giống 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 cách sử dụng + Lựa 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 nhật ký thực sự dài, tôi thấy thuận tiện khi sử dụng -n tù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 để chỉ ra điều này trong các bình luận.

37
Jon Ericson

Đ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.

21
trent

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 đã viết kịch bản Shell nhỏ sau đây rất hữu ích cho 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ó dưới dạng watch.sh và 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 việc sửa đổi thực sự diễn ra, bạn có thể sử dụng `md5sum "$FILE"` thay vì `ls -l "$FILE"`.

16
oliphaunt

bạn có thể sử dụng lệnh tailf

tailf logfile.log
8
reegan vijay

Bạn cũng có thể sử dụng inotifywatch/inotifywait mà hook vào kernel 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.

6
Martin

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

3
hlovdal

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à lối tắt cho --follow = --retry.

3
deinspanjer

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
    
  2. 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
    
  3. Đâ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
    
  4. 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.

2
Mezmer

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

1
phantomastray