Làm cách nào tôi có thể in một tiêu đề có điều kiện TRƯỚC thiết bị xuất chuẩn, nếu có bất kỳ đầu ra nào trên thiết bị xuất chuẩn


7

Tôi có một quy trình lọc danh sách các tệp từ một thư mục (phải findkiểm tra xem có tệp nào cũ hơn một khoảng thời gian nhất định để hiển thị hàng đợi bị kẹt không). Nó có thể hoặc không thể trả lại bất cứ điều gì, và nếu có, nó được gửi qua đường bưu điện cron.

Những gì tôi muốn biết là nếu có một chương trình hoặc bashphương thức đơn giản để dẫn đầu ra này đến, và nếu có bất kỳ đầu ra nào qua nó, hãy thêm một dòng tiêu đề (như "Đây là các tệp bị kẹt trong hàng đợi").


Liên quan (không phải là một bản sao, tôi đã bỏ phiếu để đóng và sau đó nhận ra đây là nhầm lẫn): Cách kiểm tra xem đường ống có trống không khi bạn muốn làm gì đó khác khi đầu vào trống rỗng
Gilles 'SO- ngừng trở thành ác quỷ'

Câu trả lời:


7

sed nội tuyến trả lời:

find ./files -mtime +90|sed '1s/^/Files stuck in queue:\n/'

Điều này hoạt động, và là những gì tôi đã kết thúc bằng cách sử dụng.
silvein

1
@silvein: Có vẻ như ngắn là tiêu chí chính của bạn, vì vậy đây là một vài điểm: câu trả lời của camh awk có thể được điều chỉnh là chỉ dài hơn 8 ký tự so với sed (ở trên): awk 'NR==1{print "header"}1'... nhưng thậm chí ngắn hơn ở trên, bởi 5 ký tự, là : sed "1i header"
Peter.O

@ Peter.O Như với tất cả mọi thứ Unix-y, có nhiều cách để làm một cái gì đó. Nhưng khả năng tôi có thể nhớ nó sẽ tăng lên nếu nó ngắn hơn.
silvein

5

Vì các phương thức khác không thực sự cung cấp một bashphương thức, như đã yêu cầu:

command | while IFS= read -r line; do
    (( i )) || { printf '%s\n' 'These are the files stuck in the queue:' ; (( i++ )) ; }
    printf '%s\n' "${line}"
done

Tất cả các lệnh được sử dụng là nội bộ để bash.

Nếu không có dòng đầu ra, sẽ không có gì được in. Nếu có, dòng tiêu đề sẽ được in, và sau đó đầu ra từ command.


Điều này đã làm việc, và có lợi thế là tất cả bash.
silvein

4

Khi tôi thấy tôi muốn giữ trạng thái khi xử lý luồng đầu vào, tôi thấy awk thường là công cụ tốt nhất để sử dụng.

Trong trường hợp này, bạn muốn xử lý một luồng và nếu bạn thấy một số đầu vào, hãy viết ra một tiêu đề và ghi lại rằng bạn đã viết tiêu đề.

awk '!input_seen { print "header"; input_seen = 1 } 1'

Điều này sẽ in một tiêu đề nếu biến input_seenlà sai (mà nó mặc định là nếu không xác định) và đặt nó thành một giá trị thật (1). Các 1ở cuối là một quy tắc mà là một cách ngắn tay nói: in dòng hiện - bạn cũng có thể thay thế 1với { print }.


Điều này đã làm việc, và tôi sẽ sử dụng nó nhưng nó dài hơn một chút so với sedphiên bản.
silvein

0

Hoặc là,

output=$(command)
[[ -n $output ]] && { echo "header"; echo "$output"; }
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.