2009-02-04 31 views
6

Gần đây, tôi đã xem một số nhật ký máy chủ sử dụng tail -f và đã nghĩ rằng sẽ dễ dàng hơn để xem một số thứ nếu tôi có thể định dạng đầu ra. Thực sự tất cả tôi đang tìm kiếm là một cách để có thể tô màu một số từ nhất định (được xác định bởi một regex), và có lẽ loại bỏ một số từ (một lần nữa, được xác định bởi một regex).Áp dụng định dạng cho vỏ unix

I knowthere's chương trình trực quan hóa nhật ký máy chủ trong thời gian thực và không có gì, nhưng tôi quan tâm hơn đến điều này.

Trả lời

11

Đường ống đầu ra của tail -f vào sed và thêm vào một số ANSI escape codes. Ví dụ, sau đây sẽ tô màu tất cả các số màu đỏ (màu 31) và tất cả các chuỗi trích dẫn trong vàng tươi (màu 93):

RED=`echo -en '\e[31m'` 
YELLOW=`echo -en '\e[93m'` 
RESET=`echo -en '\e[00m'` 
tail -f file | sed -E "s/([0-9]+)/$RED\1$RESET/g;s/(\"[^\"]*\")/$YELLOW\1$RESET/g" 
+0

một vấn đề: tùy chọn -E gây ra lỗi? – nickf

+0

Bạn cần thay thế -E bằng -e và thoát tất cả các dấu ngoặc đơn. đuôi -f tệp | sed -e "s/\ ([0-9] + \)/$ RED \ 1 $ RESET/g; s/\ (\" [^ \ "] * \" \)/$ VÀNG \ 1 $ RESET/g " – itsadok

+0

-E là không cần thiết. -E là một tùy chọn để sử dụng regexps mở rộng để bạn không cần phải thoát khỏi dấu ngoặc đơn, nhưng rõ ràng -E không có sẵn trên tất cả các phiên bản của sed. –

5

Tôi nghĩ rằng những gì bạn đang tìm kiếm là một số loại tập lệnh sed sẽ bao quanh các từ bạn chọn với chuỗi màu ANSI thoát. (hmm ... lemme nhìn).

EDIT OK, đã nhận nó:

Dưới đây là một ví dụ cho outputting "Hello" trong đỏ sẫm:

echo -e "\033[31mHello\033[0m" 

gì đang xảy ra? Trước hết, tôi đang sử dụng echo -e để echo không chuyển đổi dấu gạch chéo thành dấu gạch chéo trên màn hình, nhưng thay vì đọc chuỗi thoát của \033 làm một ký tự thoát duy nhất. Điều này thực sự chỉ là 33 trong bát phân, là 27 (thứ tự cho khóa ESC).

Vì vậy, những gì đang thực sự được gửi đến màn hình là một cái gì đó như:

<ESC>[32mHello<ESC>[0m 

nào hiển thị ANSI giải thích là "đầu tiên làm lệnh 32m, đầu ra 'Hello', và sau đó làm lệnh 0m.

Trong trường hợp này, lệnh 32m có nghĩa là "đặt màu của vùng đất thành 2" và vì màu # 2 có màu đỏ đậm, "bút" được thiết bị đầu cuối sử dụng sẽ có màu đỏ sậm. trở đi, tất cả các văn bản sẽ được hiển thị trên màn hình sẽ được dar k đỏ.

Khi chúng tôi thực hiện xuất văn bản được cho là màu đỏ, chúng tôi muốn đặt lại màu, vì vậy chúng tôi gọi lệnh 0m để đặt lại màu thành bình thường.

Để biết danh sách tất cả các mã thoát, tra cứu trong [http://en.wikipedia.org/wiki/ANSI_escape_code Wikipedia] hoặc chỉ cần google cho nó.

Vì vậy, tất cả tập lệnh sed của bạn phải làm là thay thế các từ bạn chọn bằng các từ được bao quanh bởi các màu. Ví dụ, để thay thế từ "tháng hai" trong /var/log/messages, làm như sau:

tail /var/log/messages | sed -e "s/Feb/\\o033[31m&\\o033[0m/" 

(Bạn có thể phải thực hiện điều này như là người chủ thực sự đọc /var/log/messages)

Tất cả những gì sed làm là tìm kiếm các từ "Feb" và bao quanh nó với cùng chuỗi thoát như chúng ta đã sử dụng ở trên.

Bạn có thể mở rộng nó để tô màu nhiều từ:

tail /var/log/messages | sed -e "s/\(Feb\|Mar\|Apr\)/\\o033[31m&\\o033[0m/g" 

Trong đó sẽ tô màu "tháng hai", "Mar", "Tháng tư" - mỗi màu đỏ sẫm.

Tôi hy vọng điều này sẽ cung cấp cho bạn một số ý tưởng về cách thực hiện những gì bạn cần!

+0

cảm ơn câu trả lời chi tiết! – nickf

3

Nhờ cả scraimer và Adam, tôi đã đưa ra khá nhiều những gì tôi đã sau đó, và tôi nghĩ rằng tôi muốn chia sẻ nó ở đây cho bất cứ ai khác:

RED=`echo -en '\e[31m'` 
YELLOW=`echo -en '\e[93m'` 
RESET=`echo -en '\e[00m'` 

# line breaks here are just for formatting 
tail -f ~/access-logs/access.log | sed -e "[email protected]\([0-9\.]\+\) - - 
    \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \" 
    \(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".* 
    @\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \[email protected]" 

# here's the full line if you wanted to copy it 
# tail -f ~/access-logs/access.log | sed -e "[email protected]\([0-9\.]\+\) - - \[[0-9]\+/[a-zA-Z]\+/[0-9]\+:\([0-9]\+:[0-9]\+:[0-9]\+\) +[0-9]\+] \"\(.\+\) HTTP/1\.[01]\" \([0-9]\+\) \([-0-9]\+\) \"\([^\"]\+\)\".*@\n\2 $YELLOW\4$RESET (\1)\n$RED\3$RESET\nBytes: \5\nFrom: \[email protected]" 

những biến này:

182.108.1.20 - - [04/Feb/2009:23:24:41 +1000] "GET /images/exam_room.jpg HTTP/1.0" 200 8559 "http://www.myserver.com/courses/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" 

Into này (nhưng với một số màu sắc):

23:24:41 200 (182.108.1.20) 
GET /images/exam_room.jpg 
Bytes: 8559 
From: http://www.myserver.com/courses/ 
Các vấn đề liên quan