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 줄을 업데이트했습니다.