Làm cách nào để giới hạn số dòng mà đầu ra của lệnh có sẵn trong bash?


11

Tôi bắt đầu tải xuống một tập tin lớn trong nền bằng cách sử dụng

$ nohup wget http://example.tld/big.iso &

cũng cung cấp cho tôi một nohup.outtập tin bao gồm đầu ra của wget.

Bây giờ, nếu sau này tôi muốn xem quá trình tải xuống, tôi có thể sử dụng $ tail -f nohup.outnhưng nó sẽ lấp đầy cửa sổ đầu cuối của tôi nhanh hơn tôi mong muốn. Những gì tôi muốn thấy là dòng cuối cùng liên tục cập nhật (giống như khi sử dụng wgetmột mình).

Tôi đã thử $ tail -n 1 -f nohup.outnhưng dường như chỉ ảnh hưởng đến cái đuôi ban đầu '.

Nói chung, nếu có thể giới hạn (trong trường hợp này là 1) số lượng dòng mà đầu ra của lệnh có sẵn / hiển thị thì nó sẽ giải quyết vấn đề này. Sắp xếp có đầu ra trong bộ đệm Thông tư - chỉ cần nghĩ về thanh tiến trình bình thường $ wget example.tld/big.isosẽ in.

Có một giải pháp như vậy?

Hay tôi đang trèo cây sai cách? (Có nghĩa là, sẽ dễ dàng hơn để hạn chế nohupđầu ra hoặc làm một cái gì đó khác?)

Câu trả lời:


10

Nếu bạn không muốn giới hạn vùng cuộn (xem câu trả lời khác của tôi), bạn cũng có thể sử dụng trở lại vận chuyển để quay lại đầu dòng trước khi in dòng tiếp theo. Có một chuỗi thoát giúp xóa phần còn lại của dòng, điều này là cần thiết khi dòng hiện tại ngắn hơn dòng trước đó.

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
el="$(tput el)"; # Clear to the end of the line
tail -n 1 -f nohup.out | while read -r line; do echo -n $'\r'"$el$line"; done;

6

Bạn có thể sử dụng watchở đây:

watch -n 0.5 -e "tail -n 1 nohup.out"

Chỉnh sửa : Tùy chọn -e(bí danh --exec) có vẻ phù hợp ở đây. Đặc biệt nếu bạn nhắm đến việc chạy watchvới những khoảng thời gian rất nhỏ, điều này sẽ giảm chi phí gây ra bởi việc chạy sh -cnội bộ watchtrong mỗi chu kỳ.


2
Lưu ý rằng điều này sinh ra một tailquy trình mới mỗi giây, có thể hoặc không phải là điều bạn quan tâm. Ngoài ra, hãy đảm bảo chỉ định khoảng thời gian phụ (ví dụ watch -n 0.1) để mô phỏng phần "cập nhật liên tục". (Điều này rõ ràng cũng làm tăng số lượng quy trình và tệp cuộc gọi mở.) Cuối cùng, nếu bạn đang sử dụng OS X, bạn có thể nhận được watchtừ MacPorts, vì nó không có sẵn theo mặc định.
janmoesen

Đây là một chút giải quyết, nhưng tuyệt vời như vậy. Tôi đã mong đợi câu trả lời không toàn màn hình, để tôi sẽ thấy các kết quả đầu ra trước đó - nhưng thực sự tôi có thể sử dụng watchtrong một cửa sổ đầu cuối mới. Tôi cũng phát hiện ra rằng việc sử dụng tail -n 2hữu ích hơn so -n 1với wget, ít nhất là trong watchkhoảng thời gian 1 giây, bởi vì nếu không thì phần trăm mới nhất có thể không được nhìn thấy; Đây không phải là một lỗ hổng trong câu trả lời của bạn, nhưng tôi đã đề cập đến nó nếu người khác quyết định xem wget có đuôi đầu ra nohup.
Jari Keinänen

@janmoesen Đối với kịch bản cụ thể này, có một tailquy trình mới có lẽ không quá nhiều; nhưng như một câu trả lời chung, điều này là tốt để tính đến. Tôi cũng lưu ý rằng watch -n 0.1nó không hoạt động, nhưng watch -n 0,1đã hoạt động - có thể có các ngôn ngữ được áp dụng, mặc dù tôi chưa thấy các ngôn ngữ được áp dụng cho các tùy chọn lệnh đầu cuối trước đó. Như một lưu ý phụ: cũng brew install watchhoạt động rất tốt :-)
Jari Keinänen

Lưu ý bên lề: Việc watchsẽ hoạt động với 0,1hoặc 0.1phụ thuộc vào cài đặt ngôn ngữ của bạn (nó sử dụng ký hiệu thập phân được xác định cho ngôn ngữ của bạn). Kiểm tra LC_ALL=C watch -n 0.1 "date +%S.%N".
rozcietrzewiacz

3

Có một số trình tự điều khiển Xterm nhất định mà bạn có thể sử dụng để giới hạn các dòng của thiết bị đầu cuối được cuộn. Tìm "Đặt vùng cuộn". Đó là một chút bùn, mặc dù. Hãy chắc chắn để thiết lập lại thiết bị đầu cuối của bạn sau đó:

nohup wget http://cdimage.debian.org/debian-cd/6.0.3/amd64/iso-dvd/debian-6.0.3-amd64-DVD-1.iso &
clear; echo -n $'\e[1;2r'; tail -f nohup.out | grep --line-buffered .
# The "grep" line is to ensure a single line; you can also use "awk 1" or "sed" etc.

<Chèn ghi chú thông thường về tính không di động ở đây>
janmoesen

Đây là một lựa chọn tuyệt vời khác, nhưng một trong đó cũng được sử dụng tốt nhất trong cửa sổ chuyên dụng vì tail -fvẫn lấp đầy bộ đệm và vì thiết bị đầu cuối cần thiết lập lại sau đó. Đây không phải là nội tuyến như tôi hy vọng, nhưng nếu không nó có thể là những gì tôi tìm kiếm.
Jari Keinänen

0

Nếu bạn không muốn đầu ra chiếm toàn bộ cửa sổ terminal hiện tại, bạn có thể sử dụng một whilevòng lặp đơn giản :

while true; do 
  XXX=$( tail -n1 my.log )
  echo -en " \r$XXX\r"
  sleep 0.5
done; echo

1
Lưu ý rằng để có thể cuộn đầu ra thiết bị đầu cuối trong khi bất kỳ lệnh sản xuất đầu ra nào đang chạy, bạn cần chỉnh sửa cài đặt trình giả lập thiết bị đầu cuối và scrollTtyOutputtùy chọn tắt (hoặc tương tự).
rozcietrzewiacz
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.