2009-02-04 5 views
6

최근에 tail -f을 사용하여 일부 서버 로그를보고 있었는데 출력을 포맷 할 수 있다면 몇 가지 사항을 더 쉽게 볼 수 있다고 생각했습니다. 정말 내가 원하는 것은 특정 단어 (정규 표현식으로 결정)에 색상을 지정하고 어쩌면 정규식에 의해 결정된 특정 단어를 제거하는 방법입니다.유닉스 쉘에 포맷 적용

knowthere's 서버 로그를 실시간으로 시각적으로 표시하는 프로그램이지만이 점에 더 관심이 있습니다.

답변

11

tail -f의 출력을 sed으로 파이프하고 ANSI escape codes을 추가하십시오. 예를 들어, 다음은 빨간색으로 모든 숫자 (색상 31) 모든 인용 밝은 노란색 (색상 93) 문자열 색상 화됩니다 scraimer 아담 모두

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

한 가지 문제점 : -E 옵션으로 인해 오류가 발생합니까? – nickf

+0

-E를 -e로 바꾸고 모든 괄호를 이스케이프 처리해야합니다. 꼬리 -f 파일 | (\ "[^ \] \)/$ YELLOW \ 1 $ RESET/g \ sed \ g " – itsadok

+0

-e는 반드시 필요한 것은 아닙니다. -E는 확장 정규 표현식을 사용하여 괄호를 이스케이프 할 필요가 없지만 모든 버전의 sed에서 사용할 수있는 것은 아닙니다. –

5

나는 당신이 ANSI Color 이스케이프 시퀀스로 선택한 단어를 둘러싸는 일종의 sed 스크립트라고 생각합니다. (흠 ...). 무슨 일이야

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

: 여기에 어두운 빨간색으로 "안녕하세요"출력하는 예입니다

:

편집 확인, 그것을 가지고? 먼저 을 사용하여 echo이 슬래시를 화면의 슬래시로 변환하지 않고 단일 이스케이프 문자로 \033의 이스케이프 시퀀스를 읽습니다. 실제로는 8 진수의 33에 불과하며 27 (ESC 키의 서수)입니다. 는 ANSI 디스플레이로 해석

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

안녕하세요 ""첫째, 출력을 명령 32m을 "다음 명령 0m을 수행

은 그래서 정말 화면으로 전송되는 것은 같은 것이있다.

이 경우 명령 32m은 "forground color를 2로 설정"을 의미하고 색상 # 2는 진한 빨간색이므로 터미널에서 사용되는 "pen"이 이제는 진한 빨간색으로 표시됩니다. 앞으로는 화면에 표시 될 모든 텍스트가 dar로 표시됩니다. k 빨강.

빨간색으로 표시되어야 할 텍스트를 출력했으면 색상을 재설정하기 위해 색상을 보통으로 재설정하는 0m 명령을 호출합니다.

모든 이스케이프 코드 목록을 보려면 [http://en.wikipedia.org/wiki/ANSI_escape_code 위키 백과]를 검색하거나 Google에 알려주세요.

그래서 모든 sed 스크립트는 선택한 단어를 색상으로 둘러 쌓인 단어로 바꾸면됩니다. 예를 들어, 수행 /var/log/messages에서 단어 "이월"교체하려면 다음과

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

에 대한 모든 것을 sed했던이었다 검색을 (당신은 실제로 /var/log/messages을 읽을 루트로이 작업을 수행해야 할 수도 있습니다) "Feb"라는 단어를 사용하고 위에 사용 된 것과 동일한 이스케이프 시퀀스로이 단어를 둘러 쌉니다.

여러 단어 색상을 그것을 확장 할 수 :

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

가 어떤 "이월"색상 것 "월", "4월"- 진한 빨강의 각.

필요한 사항을 수행하는 방법에 대한 아이디어가 있으면 좋겠습니다.

+0

자세한 답변을 보내 주셔서 감사합니다. – nickf

3

감사합니다, 나는 거의 내가 무슨 함께했다 (하지만 일부 색상)이 속으로

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)" 

:

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]" 

이 바뀝니다 : 후, 나는 내가 다른 사람을 위해 여기를 공유하고자합니다

,536,
23:24:41 200 (182.108.1.20) 
GET /images/exam_room.jpg 
Bytes: 8559 
From: http://www.myserver.com/courses/