2012-08-14 2 views
3

과 일치하는 줄을 제거 I이 (irssi에 의해 생성) IRC 로그에서 날짜를 구문 분석에 대한 다음과 같은 간단한 스크립트다음 라인이 특정 패턴

#!/bin/bash                     
query=$1 

grep -n $query logfile > matches.log 
grep -n "Day changed" logfile >> matches.log 

cat matches.log | sort -n 

그것은 생산 출력과 같은 :

--- Day changed Tue Jul 03 2012 
--- Day changed Wed Jul 04 2012 
--- Day changed Thu Jul 05 2012 
16:54 <@Hamatti> who let the dogs out 
--- Day changed Fri Jul 06 2012 
--- Day changed Sat Jul 07 2012 
--- Day changed Sun Jul 08 2012 
12:11 <@Hamatti> dogs are fun 

그러나 이후 나는 실제 경기 일정을 찾는 데에만 관심이있다. 나는 모든 것을 걸러 내고 싶다.

--- Day changed XXX XXX dd dddd 

행은 다음 행의 시간 소인을 따라 가지 않습니다. 따라서 예제는 유용하지 않은 모든 잘못된 정보를 제거하기 위해

--- Day changed Thu Jul 05 2012 
16:54 <@Hamatti> who let the dogs out 
--- Day changed Sun Jul 08 2012 
12:11 <@Hamatti> dogs are fun 

을 출력해야합니다.

편집. T. Zelieke가 대답 한 후에 나는 이것을 한 줄짜리로 만들 수 있음을 깨달았습니다. 그래서 이제 로그 파일을 두 번 반복하지 않도록 저장합니다.

query=$1 
egrep "$query|Day changed" logfile |grep -B1 "^[^-]" |sed '/^--$/d' 

답변

2
grep -B1 "^[^-]" data |sed '/^--$/d' 

이 대시 ("^[^-]")로 시작하지 않는 행을 필터링하는 grep를 사용합니다. -B1는 일치하기 전에 즉각적인 줄을 인쇄하도록 요구합니다.
불행히도 grep-- 행으로 각 일치 (두 행 쌍)를 분리합니다. 따라서 나는 파이프를 사용하여 sed을 통해 그 superflouos 라인을 제거합니다.

+0

감사합니다.이 점이 매력입니다. 교육적인 목적으로 조금 열 수 있습니까? 왜 작동합니까? 편집. 설명 주셔서 감사합니다! – Hamatti

+0

그런 간단한 대답. :) –

2

여기 awk를 사용하는 사람이 있습니다.

awk -v query="$1" '/^--- Day changed/{day=$0;next} $0 ~ query {if (day!=p) {print day;p=day}; print}' 

그것은 "날이 변경"라인을 발견 할 때마다, 그것은 변수 day에 저장합니다. 그런 다음 쿼리와 일치하는 항목을 찾으면 현재 저장된 날짜 행을 먼저 출력합니다. 같은 날에 여러 개의 일치 항목이있는 경우 변수 p을 사용하여 날짜 행이 이미 인쇄되었는지 확인합니다.

관련 문제