Đầu ra của lệnh 'xem' dưới dạng danh sách


27

Tôi muốn thực hiện một số tính toán đơn giản về số lượng dòng mỗi phút được thêm vào một tệp nhật ký.

Tôi cũng muốn lưu trữ số đếm cho mỗi giây.

Những gì tôi cần là đầu ra của lệnh sau dưới dạng một danh sách sẽ được cập nhật mỗi giây:

watch -n1 'wc -l my.log'

Làm cách nào để xuất 'cập nhật' của lệnh 'xem' dưới dạng danh sách?

Câu trả lời:


24

Bạn có thể sử dụng công -ttắc watchkhiến nó không in tiêu đề. Tuy nhiên, điều đó sẽ vẫn xóa màn hình để bạn có thể tốt hơn với một vòng lặp shell đơn giản:

while sleep 1; do
    wc -l my.log
done

Một trong những lợi thế là, bạn có thể dễ dàng thêm các lệnh khác (ví dụ date) và / hoặc dẫn đầu ra thông qua sedđể định dạng lại nó. Bằng cách này, nếu bạn thay đổi sleep 1với wctrong vòng lặp, nó sẽ tự động chấm dứt về lỗi.


Tuy nhiên, lưu ý rằng nó sẽ không thực hiện chính xác từng giây (với zsh hoặc ksh93, bạn có thể điều chỉnh thời gian ngủ để tính toán độ trôi phát sinh bằng cách chạy các lệnh trong vòng lặp)
Stéphane Chazelas

2
@StephaneChazelas cũng sẽ không wait- chỉ cần thử watch -n 1 "sleep 5".
peterph

Thật vậy (tôi đã kiểm tra cả việc triển khai Procps và busybox). Tôi nghĩ rằng đó là điều duy nhất watchhữu ích cho nó, nhưng nó thậm chí không cung cấp cho bạn giải pháp của bạn tốt như một chiếc đồng hồ, nhưng không trả lời câu hỏi "tốc độ phát triển của tệp nhật ký" với độ chính xác cao.
Stéphane Chazelas

Chà, nếu các dòng trên phút là mục tiêu cuối cùng, thì cứ sau 10 giây lấy mẫu một lần là quá đủ - vì vậy chi phí không quá khủng khiếp (tất nhiên trừ khi tệp phát triển thực sự lớn). Và thực tế từ bên trong vòng lặp, người ta có thể in thông tin về thời gian (thậm chí cả trước và sau khi lệnh kết thúc nếu cần thiết), và sau đó độ chính xác có thể trở nên tốt hơn (thứ tự cường độ) ngay cả đối với các tệp lớn hơn.
peterph

1
@peterph watchcó một -ptùy chọn sẽ thực hiện đúng, nếu có thể (rõ ràng, bạn không thể thực hiện một lệnh mất 5 giây mỗi 1 giây, nếu bạn không được phép đồng thời nhiều lần). Tôi biết, tôi đã viết nó :-P
derobert

8

Một câu hỏi cũ, nhưng tôi chỉ tìm thấy một câu trả lời rất dễ:

watch -n1 'wc -l my.log | tee -a statistics.log'

Điều này sẽ thực thi wcmỗi giây của bạn , thêm đầu ra của nó vào tệp stats.log và cũng hiển thị nó trên màn hình.
Vì vậy, bạn sẽ kết thúc với một tệp chứa đầy số, biểu thị số dòng liên tiếp của my.log.


Xin lưu ý rằng lệnh này là watch "($MYCMD | tee -a $MYLOG)", không watch "($MYCMD)" | tee -a $MYLOG. Nếu bạn đã làm sai như tôi đã làm, đầu ra sẽ rất rất khó hiểu. Một điều cần lưu ý ở đây là lệnh này không thêm dấu thời gian của mỗi lần thực thi lệnh, vì vậy câu trả lời với vòng lặp vẫn có thể hoạt động tốt hơn cho bạn.
ffledgling


3

Hãy thử như sau:

watch -n1 'wc -l my.log >> statistics.log'

1

Tôi đã gặp câu hỏi này khi tôi đang cố gắng để có được đầu ra tốt hơn / đăng nhập từ du -sh $data_path. Tôi đã sử dụng mẫu "lệnh while, do ngủ" được tìm thấy ở đây, nhưng đã sử dụng một số AWK phức tạp để đưa ra kết quả mà tôi muốn.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

Tôi thực sự đã làm điều này như một oneliner, đó là lý do tại sao có dấu chấm phẩy. Nhưng để làm cho nó dễ đọc, tôi đã phá vỡ nó. Đầu ra trông như sau:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

Bạn có thể tạo một kịch bản làm điều đó cho bạn. Tôi gọi cho tôi keep(như, tiếp tục làm nó) và đặt nó trên bincon đường.

Đây là kịch bản của tôi:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
Bạn nên sử dụng "$@"để thực thi lệnh (đối số) thay vì không trích dẫn $*. Bằng cách này, bạn sẽ có shell giữ các đối số được trích dẫn, v.v. như người dùng sẽ mong đợi chúng. FTFY.
roaima ngày
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.