Grep - 일치 후 다양한 행 크기의 콘텐츠 반환

Grep - 일치 후 다양한 행 크기의 콘텐츠 반환

grep일치 후 행 크기가 다른 콘텐츠를 반환하는 방법을 찾아야 합니다 . 어떤 게임은 4줄로 이어지며, 어떤 게임은 20줄로 이어집니다. 나는 그들 모두가 필요합니다.

매시간 다음과 같은 타임스탬프가 포함된 이전 시간의 로그 항목을 반환하려고 합니다.

time: 20200115132443

이를 위해 각 cronjob이 이전 시간의 타임스탬프를 grep 문으로 실행한다고 가정합니다.

grep "time: 2020011507"

내가 겪고 있는 문제는 일치 후 일부 항목의 로그 크기가 다르기 때문에 이와 같은 것이 grep -C 5항상 작동하지 않는다는 것입니다.

다음 일치하는 grep 문(마지막 항목이 누락됨)과 일치하는 모든 항목을 반환해야 하는지, 아니면 이를 실행하는 다른 방법이 있는지 궁금합니다. 샘플 로그 파일 조각은 다음과 같습니다.

time: 20200115132443
logging stuffs
time: 20200115134543
more logging 
stuffs 
like this
time: 20200115140201 # this should now not be returned

어쩌면 너무 복잡해서 grep현재 시간에 대한 명령문을 실행한 다음 해당 시간 이전과 이전 시간 이후의 모든 것을 가져올 수도 있습니다.

답변1

가능한 방법:

# variable S0 - date string for hour ago
S0="time: $(date -d '1 hour ago' +%Y%m%d%H)"
# Variable S1 - date string for current hour
S1="time: $(date +%Y%m%d%H)"
# taking lines from between two just defined strings
# including first and excluding second date string
# from file /var/log/log.log
sed -n "/^${S0}/,/^${S1}/ {/^${S1}/"'!p};' /var/log/log.log

이제 이를 컴팩트한 단일 라이너로 만들어 보십시오.

sed -n "/^time: $(date -d '1 hour ago' +%Y%m%d%H)/,/^time: $(date +%Y%m%d%H)/ {/^time: $(date +%Y%m%d%H)/"'!p}' /var/log/log.log

출력을 임시 파일로 리디렉션하여 사용할 수 있습니다.

또는 라이너 끝에 파이프와 grep을 추가할 수도 있습니다.

|grep "mystring"

.

폴리스티렌운영 체제 종속 명령날짜형식은 다를 수 있습니다.

  • 여기서 사용하는 Linux는 다음과 같습니다.날짜 -d '1시간 전' +%Y%m%d%H

  • 우리는 리눅스를 사용할 수 있습니다:날짜-d @$(($(Date+%s)-3600)) +%Y%m%d%H

  • 맥 OS X:날짜-r $(($(Date+%s)-3600)) +%Y%m%d%H

등.

고쳐 쓰다:발견된 마지막 줄을 제거하는 데 사용된 sed 부분 "$d"가 작동하지 않는 것을 발견하여 제대로 작동하도록 sed 줄을 업데이트했습니다.

관련 정보