Grep은 숫자 범위를 얻습니다.

Grep은 숫자 범위를 얻습니다.

로그 파일에서 날짜 범위를 어떻게 검색합니까?

로그 파일은 다음과 같습니다.

01/14 00:00:01  INFO:     received connect request from 10.10.10.10 

8시 25분부터 8시 35분까지 계속해서 로그를 10분으로 압축해야 합니다.

다음 egrep을 사용하면 다음과 같은 결과가 너무 많이 나타납니다 00:08:25 01:08:25.08:25:00

어떻게 08:25:00합격 할 수 있나요?08:35:59

내가 시도한 것

cat foo | egrep "08:2[5-9]|08:3[0-5]"
cat foo | egrep "08:2[5-9]:??|08:3[0-5]:??"
cat foo | egrep "08:2[5-9]:[0-9][0-9]|08:3[0-5]:[0-9][0-9]"

답변1

이렇게 하면 원하는 결과가 생성됩니다.

egrep "08:[2][5-9]:[0-5][0-9]|08:[3][0-5]:[0-5][0-9]" foo

cat이 경우에는 필요하지 않습니다.

답변2

다음 입력을 사용하면:

01/15 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:25:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:35:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10

다음을 사용하여 두 패턴 사이의 모든 줄을 인쇄할 수 있습니다 awk.

awk -v date='01/14' '$1!=date{next};/08:25/,/08:35/' logfile

01/14 08:25:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 00:00:01  INFO:     received connect request from 10.10.10.10
01/14 08:35:01  INFO:     received connect request from 10.10.10.10

답변3

이를 사용하고 싶다면 다음을 sed수행할 수 있습니다.

sed -n '/^01\/14 08:00/,/^01\/14 08:10/p' foo

일반적으로 bash 변수를 사용하여 위 명령의 특정 시간을 바꿀 수 있습니다. 예를 들어:

st="01\/14 08:00"
en="01\/14 08:25"
sed -n "/^$st/,/^$en/p" foo #note the double quotes

/위 명령에 표시된 대로 문자를 이스케이프하려면 구분 기호로 if를 사용해야 합니다 .\/

답변4

펄을 사용할 수 있습니다. 다음은 시간 필드에 대한 어휘 비교를 수행합니다. 즉, 시작 또는 종료 시간을 포함하는 행이 없더라도 작동합니다.

 yourprogram | perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00"'

이는 시간이 입력의 두 번째 필드이고 형식이라고 가정합니다 hh:mm:ss.

다른 조건을 추가하여 날짜를 지정할 수도 있습니다.

 yourprogram | perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00" and $F[0] eq "01/14"'

입력은 다음 스크립트를 사용하여 생성됩니다.

for ((h=8;h<9;h++)); do
  for ((m=20;m<40;m=m+2)); do
    for ((s=0;s<60;s=s+10)); do
      printf "01/14 %02d:%02d:%02d line %d\n" $h $m $s $((++l))
    done
  done
done

실행 중

bash script | perl -lane 'print if $F[1] ge "08:25:00" and $F[1] lt "08:36:00"'

생산하다:

01/14 08:26:00 line 19
01/14 08:26:10 line 20
01/14 08:26:20 line 21
01/14 08:26:30 line 22
01/14 08:26:40 line 23
01/14 08:26:50 line 24
01/14 08:28:00 line 25
01/14 08:28:10 line 26
01/14 08:28:20 line 27
01/14 08:28:30 line 28
01/14 08:28:40 line 29
01/14 08:28:50 line 30
01/14 08:30:00 line 31
01/14 08:30:10 line 32
01/14 08:30:20 line 33
01/14 08:30:30 line 34
01/14 08:30:40 line 35
01/14 08:30:50 line 36
01/14 08:32:00 line 37
01/14 08:32:10 line 38
01/14 08:32:20 line 39
01/14 08:32:30 line 40
01/14 08:32:40 line 41
01/14 08:32:50 line 42
01/14 08:34:00 line 43
01/14 08:34:10 line 44
01/14 08:34:20 line 45
01/14 08:34:30 line 46
01/14 08:34:40 line 47
01/14 08:34:50 line 48

관련 정보