파일 맨 아래부터 시작하여 두 타임스탬프 사이의 문자열을 검색합니다.

파일 맨 아래부터 시작하여 두 타임스탬프 사이의 문자열을 검색합니다.

저는 Cannot proceed: the cube has no data거대한 test.txt 파일에서 어제 오후 22시 30분과 오늘 오전 00시 30분 사이의 타임스탬프 사이에 있는 문자열을 찾으려고 합니다.

스크립트:

tac test.txt | awk -v today=$(date "+%d") -v yesterday=$(date "+%d" -d yesterday) '/Cannot proceed: the cube has no data/ {f=$0; next} f{if (($3==yesterday && $4>"22:30:00") || ($4==today && $4<="00:30:00")) {print; print f} f=""}'

테스트.txt:

[Thu Jun  8 07:56:17 2014]Local/data///47480280486528/Info(1019022)
Writing Database Mapping For [data]

[Thu Jun  8 12:56:38 2014]Local/data///47480280486528/Info(1250008)
Setting Outline Paging Cachesize To [8192KB]

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data 

[Thu Jun  8 23:26:18 2014]Local/data///47480280486528/Info(1013205)
Received Command [Load Database]

[Thu Jun  9 00:16:23 2014]Local/data///47480280486528/Info(1019018)
Writing Parameters For Database 

[Thu Jun  9 00:21:20 2014]Local/data///47480280486528/Info(1013205)
Writing Parameters For Database 

[Thu Jun  9 00:29:00 2014]Local/data///47480280486528/Info(1013205)
Cannot proceed: the cube has no data

[Thu Jun  9 01:25:21 2014]Local/data///47480280486528/Info(1019018)
Cannot proceed: the cube has no data 

산출:

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data

일치하는 문자열이 모두 출력에 표시되지 않는 이유는 무엇입니까? 내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

나는 awk그것에 익숙하지 않아서 작동에 대해 구체적인 조언을 줄 수는 없지만 이것이 효과가 있을 것이라고 확신합니다.

tac ./file |
sed -e "/$(date -d"2 days ago")/q" -e \
    '/Cannot proceed: the cube has no data/!d;h;n;G'

이와 같이 파일을 거꾸로 읽으면 tac대상 오류가 먼저 오고 날짜 표시줄이 그 뒤에 와야 합니다. 따라서 h대상 뒤에서 이전 행의 마지막 행을 만나 다음 행을 끌어오고 마지막 행을 끝에 추가하여 효과적으로 재정렬합니다.

d다른 모든 줄을 삭제합니다 .

2일 전 날짜가 발견될 때까지 이 검색을 계속하며, 그 시점은 q적합합니다.

관련 정보