2011-08-04 5 views
7
2011-07-01 ... /home/todd/logs/server_log_1.log ... 
2011-07-02 ... /home/todd/logs/server_log_2.log ... 
2011-07-03 ... /home/todd/logs/server_log_3.log ... 

나는 파일이 위처럼 보입니다. 파일 이름을 추출하여 STDOUT에 출력하고 싶습니다.sed/awk : 텍스트 스트림에서 패턴 추출하기

server_log_1.log 
server_log_2.log 
server_log_3.log 

누군가 도움을 줄 수 있습니까? 감사!

파일 이름 패턴은 server_log_xxx.log이며 한 줄에 한 번만 발생합니다.

AWK와
+0

때문에 (공백, 줄 바꿈, 제어 문자, 대부분의 유닉스 파일 시스템에'제외하고 아무것도 '\ 0''와'/'),이 세 줄은 하나의 유효한 파일 이름이 될 수 있습니다. 유효한 파일 이름과 두 개의'... '에 나타날 수있는 내용에 몇 가지 제한을 추가하지 않는 한 파일 이름을 안정적으로 인식 할 수있는 방법이 없습니다. 비 위주의 사용자 제어 변수 (예 : 입력, 호스트 이름)를 기록하는 로그 파일은 잘못 작성된 파서에 대한 주입 공격의 대상이 될 수 있으므로 특히주의해야합니다. – jw013

+0

jw013 : 아니요, 파일 이름에'\ n '이 필요합니다. 그렇지 않으면 그 3 줄은 3 개의 항목입니다. –

+0

@yi''\ n "은 파일 이름에서 유효한 문자입니다. "모든 가능성있는 파일 이름"에 대해 정 확한 일치를 실제로 수행 할 수는 없으며 예제처럼 필자는 전체 줄 또는 줄의 연결 (파일 시스템의 파일 이름 길이 제한까지)이 유효한 파일 이름임을 지적했습니다. 이제 Todd가 문제를 찾고있는 패턴을 지정 했으므로 (xx 부분은 아직 지정되지 않았지만 아마도 숫자를 나타 내기위한 것이기는하지만) 문제가 더 합리적이되었습니다. 나는 네가하는 말을 정말로 따라하지 않는다. – jw013

답변

16

awk 'BEGIN {FS="/"} 
    { print gensub(" .*$","","g",$5) }' INPUTFILE 

여기에 행동을 참조하십시오 가정 은 "XXX"자리 숫자 만입니다 : 파일 이름 그냥 모든 문자에 대해 포함 할 수 있습니다

grep -o 'server_log_[0-9]\+\.log' 
+0

좋은 답변입니다. 감사합니다. – Dagang

0
sed 's|.*/\([^/ ]*\).*|\1|' infile 
+3

's' 명령 끝에'p'를 추가하고 패턴과 일치하지 않는 모든 행을보고 싶지 않으면'-n' 옵션을 추가하십시오. – jw013

3

파이프 다음 명령을 통해 파일 :

sed 's/.*\(server_log_[0-9]\+\.log\).*/\1/' 
+0

sed 's /.* \ (server_log_ [0-9] \ + \. log \). */\ 1 /'가 더 간단합니다. – Dagang

+0

오른쪽이지만 이스케이프 처리 된 중괄호가 사용됩니다. 나는'. *'을 생략했기 때문에 전에는 작동하지 않았다. 내 솔루션을 업데이트했습니다. –

관련 문제