2013-05-01 26 views

Trả lời

13

Sử dụng các đường ống dẫn sau đây nếu chỉ tin nhắn chứa ERROR sẽ được hiển thị trên giao diện điều khiển (stderr):

stm |& grep ERROR | tee -a /path/to/logfile 

Sử dụng lệnh sau đây nếu tất cả các thư sẽ được hiển thị trên giao diện điều khiển (stderr):

stm |& tee /dev/stderr | grep ERROR >> /path/to/logfile 

Edit: phiên bản mà không cần kết nối đầu ra tiêu chuẩn và sai số chuẩn:

stm 2> >(grep --line-buffered ERROR | tee -a /path/to/logfile >&2) 
stm 2> >(tee /dev/stderr | grep --line-buffered ERROR >> /path/to/logfile) 
+6

'| &' sẽ kết nối cả đầu ra tiêu chuẩn và lỗi chuẩn với RHS của đường ống. – chepner

+0

stm | & grep ERROR dường như lọc ra các thư có chứa ERROR đến bàn điều khiển, nhưng vì lý do nào đó việc phát âm đến tệp nhật ký dường như luôn trả về một tệp trống, ngay cả khi tôi không muốn nó trên bàn điều khiển, stm | & grep ERROR > logfile.txt không hoạt động. – user2339933

1

này trông giống như một bản sao của How to pipe stderr, and not stdout?

Redirect stderr để "& 1", có nghĩa là "cùng một vị trí nơi stdout đang xảy ra". Sau đó chuyển hướng stdout tới/dev/null. Sau đó sử dụng một đường ống bình thường.

$ date -g 
date: invalid option -- 'g' 
Try `date --help' for more information. 
$ 
$ (echo invent ; date -g) 
invent         (stdout) 
date: invalid option -- 'g'    (stderr) 
Try `date --help' for more information. (stderr) 
$ 
$ (echo invent ; date -g) 2>&1 >/dev/null | grep inv 
date: invalid option -- 'g' 
$ 

Để sao chép đầu ra từ lệnh trên vào tệp, bạn có thể sử dụng> chuyển hướng hoặc "tee". Lệnh tee sẽ in một bản sao của đầu ra vào bàn điều khiển và bản sao thứ hai vào tệp.

$ stm 2>&1 >/dev/null | grep ERROR > errors.txt 

hoặc

$ stm 2>&1 >/dev/null | grep ERROR | tee errors.txt 
+0

Nó gần như giống như câu hỏi của stderr đường ống và grepping trên it.I chỉ muốn đăng nhập đầu ra grepped vào một tập tin đăng nhập.Tôi thậm chí không quan tâm về đầu ra trên giao diện điều khiển rất nhiều.Với một số lý do,./stm | & grep ERROR >> log.txt tạo một tệp nhật ký trống, mặc dù không có chuyển hướng đến tệp nhật ký cung cấp đầu ra của bàn điều khiển trên màn hình. – user2339933

0

Bạn có nói rằng bạn muốn cả hai stderr và stdout để xuất hiện trong giao diện điều khiển, nhưng chỉ stderr (không stdout) có chứa "ERROR" để đăng nhập vào một tập tin? Đó là điều kiện cuối cùng khiến việc tìm một giải pháp thanh lịch trở nên khó khăn. Nếu đó là những gì bạn đang tìm kiếm, đây là rất xấu xí giải pháp tôi:

touch stm.out stm.err 
stm 1>stm.out 2>stm.err & tail -f stm.out & tail -f stm.err & \ 
wait `pgrep stm`; pkill tail; grep ERROR stm.err > error.log; rm stm.err stm.out 

tôi cảnh báo bạn về nó là xấu xí. Bạn có thể ẩn nó trong một hàm, sử dụng mktemp để tạo các tên tệp tạm thời, v.v. Nếu bạn không muốn đợi stm thoát ra trước khi đăng nhập văn bản ERROR vào một tệp, bạn có thể thêm tail -f stm.err | grep ERROR > error.log & sau các lệnh đuôi khác và loại bỏ lệnh grep khỏi dòng cuối cùng.

+0

Trên thực tế yêu cầu để hiển thị trên bàn điều khiển không phải là critical.I chỉ muốn chủ yếu để grep stderr và đăng nhập nó vào một tập tin văn bản. Tôi làm ./stm | & grep ERROR >> log.txt, nhưng tôi không nhận được bất cứ điều gì o tệp văn bản. Khi tôi chạy ./stm|& grep ERROR, tôi nhận được các tin nhắn được lọc trên bảng điều khiển. – user2339933

Các vấn đề liên quan