두 타임스탬프 사이의 로그를 추출하는 방법, 행은 날짜/시간으로 시작하거나 시작하지 않을 수 있습니다.

두 타임스탬프 사이의 로그를 추출하는 방법, 행은 날짜/시간으로 시작하거나 시작하지 않을 수 있습니다.

두 타임스탬프 사이의 로그를 추출하는 방법, 행은 날짜/시간으로 시작할 수도 있고 시작하지 않을 수도 있습니다. 아래에서 시도했는데 날짜/시간으로 시작하는 행만 추출합니다. 날짜 시간 형식은 다음과 같습니다.2014-04-07 23:00

$ awk \
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]/
      {
        if ($1" "$2 >= "2014-04-07 23:00")     p=1;
        if ($1" "$2 >= "2014-04-08 02:00")  p=0;
      }
    p { print $0 }' log

내 샘플 데이터는 다음과 같습니다.

2014-04-07 22:59:10.001 agaggagag  
gagagg 
2014-04-07 23:40:33.345 aegsgssdh  
wqtqttqtqtq  
post  
agggsdgg  
2014-04-08 01:00:54.777 ggsdgwettwetewt  
cvdgwetegdkiytitityi  
error 
2014-04-08 02:02:22.009 qwwqtwtwebbcbewdhshsdh  
asgsaftewtewt  
1253536443755475  
2014-04-08 10:55:34.934 etwtewtewppip  
jklhlljkjvncncmmm  
sghywywywywyw  

2014-04-07 23:00와 사이의 모든 데이터를 추출하고 싶습니다 .2014-04-08 02:00

답변1

패턴 일치에서 RE의 시작 부분은 ^표현식을 줄의 시작 부분에 바인딩합니다. 표현식이 어디든 일치하도록 하려면 해당 표현식을 제거해야 합니다.

귀하의 if...진술에서는 날짜/시간 필드가 $1및 에 있다고 가정합니다 $2. 이는 정의에 따라 반드시 사실이 아닐 수도 있습니다. 이것을 시도해 보십시오(귀하의 데이터 샘플이 없기 때문에 테스트되지 않았습니다).

awk '
    {
        if (match($0, /\<[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]\>/))
        {
            s = substr($0, RSTART, RLENGTH)            
            if (s >= "2014-04-07 23:00") p=1
            if (s >= "2014-04-08 02:00") p=0
        }
    }
    p { print $0 }
' log

샘플 데이터 출력

2014-04-07 23:40:33.345 aegsgssdh
wqtqttqtqtq
post
agggsdgg
2014-04-08 01:00:54.777 ggsdgwettwetewt
cvdgwetegdkiytitityi
error

답변2

스크립트의 시작 부분을 다음으로 변경하십시오.

$awk\
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0- 9]/\
      {

또는

$awk\
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0- 9]/{

현재 스크립트에는 세 가지 문이 있습니다.

  1. 행이 일치하면 /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]/인쇄합니다(기본 동작).
  2. 모든 행(기본 조건)에 대해 p범위 내에 있으면 1로 설정되고 $1 $2, 범위 내에 없으면 0으로 설정됩니다.
  3. p0이 아닌 경우 해당 행을 인쇄합니다.

그래서모든날짜 타임스탬프(정규식 기반)처럼 보이는 줄은 명령문 1을 기반으로 인쇄됩니다. 날짜 타임스탬프가 포함된 선택 항목 내의 각 행은 문 2와 3 사이의 상호 작용을 기반으로 인쇄됩니다.

분명히 조건 1과 명령문 2를 함께 바인딩하려고 합니다.

답변3

귀하의 목적에 맞게 간단한 스크립트를 만들었습니다. 이것이 도움이 되는지 확인하세요.

[upkar@server2 一]# 고양이 logxtract.sh

L1=$(grep -n "2014-04-07 23:[0-9][0-9]" 로그 | awk -F":" '{print $1}')

L2=$(grep -n "2014-04-08 02:[0-9][0-9]" 로그 | awk -F":" '{print $1}')

sed -n $L1,"$L2"p 로그

스크립트 출력

[upkar@server2 一]#sh logxtract.sh

2014-04-07 23:40:33.345 aegsgssdh

wqtqttqtqtq

post

agggsdgg

2014-04-08 01:00:54.777 ggsdgwettwetewt

cvdgwetegdkiytitityi

error

2014-04-08 02:02:22.009 qwwqtwtwebbcbewdhshsdh

관련 정보