kst와 함께 사용하기 위한 Linux 로그 파일 구조 변경

kst와 함께 사용하기 위한 Linux 로그 파일 구조 변경

내 파일(네트워크 센서의 TCP 덤프)의 모양은 다음과 같습니다.

20:06:57.049686 IP(tos 0x0, ttl 64, id 26871, 오프셋 0, 플래그 [DF], 원시 UDP(17), 길이 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 길이 40
    0x0000: 4500 0044 68f7 4000 4011 25c7 8083 d0bf E..Dh.@.@.%.....
    0x0010: 8083 da24 85b1 15b3 0030 1e8b 3132 3033 ...$.....0..1203
    0x0020: 3132 2e37 3836 3036 2c20 332c 2020 2030 12.78606,.3,...0
    0x0030: 2e31 3533 2c20 2d30 2e31 3533 2c20 2039 .153,.-0.153,..9
    0x0040: 2e39 3630 .960
20:06:57.113591 IP(tos 0x0, ttl 64, id 26872, 오프셋 0, 플래그 [DF], 원시 UDP(17), 길이 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 길이 40
    0x0000: 4500 0044 68f8 4000 4011 25c6 8083 d0bf E..Dh.@.@.%.....
    0x0010: 8083 da24 85b1 15b3 0030 148f 3132 3033 ...$.....0..1203
    0x0020: 3132 2e38 3336 3131 2c20 332c 2020 2d30 12.83611,.3,..-0
    0x0030: 2e31 3533 2c20 2d30 2e34 3630 2c20 2039 .153,.-0.460,..9
    0x0040: 2e39 3630 .960
20:06:57.188105 IP(tos 0x0, ttl 64, id 26873, 오프셋 0, 플래그 [DF], 원시 UDP(17), 길이 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 길이 40
    0x0000: 4500 0044 68f9 4000 4011 25c5 8083 d0bf E..Dh.@.@.%.....
    0x0010: 8083 da24 85b1 15b3 0030 1b80 3132 3033 ...$.....0..1203
    0x0020: 3132 2e38 3836 3135 2c20 332c 2020 2d30 12.88615,.3,..-0
    0x0030: 2e31 3533 2c20 2d30 2e33 3036 2c20 2039 .153,.-0.306,..9
    0x0040: 2e38 3037 .807                                 
20:06:57.200719 IP(tos 0x0, ttl 64, id 26874, 오프셋 0, 플래그 [DF], 원시 UDP(17), 길이 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, 길이 40
    0x0000: 4500 0044 68fa 4000 4011 25c4 8083 d0bf E..Dh.@.@.%.....
    0x0010:8083 da24 85b1 15b3 0030 2884 3132 3033 ...$.....0(.1203
    0x0020: 3132 2e39 3336 3135 2c20 332c 2020 2030 12.93615,.3,...0
    0x0030: 2e31 3533 2c20 2d30 2e31 3533 2c20 2039 .153,.-0.153,..9
    0x0040: 2e38 3037 .807

다음과 같거나 비슷한 모양으로 변환해야 합니다.

20:06:57.049686 26871, 120312.78606,.0.153,.-0.153,..9.960
20:06:57.113591 26872, 120312.83611,-0.153,.-0.460,..9.960
20:06:57.188105 26873, 120312.88615,-0.153,.-0.306,..9.807
20:06:57.200719 26874, 120312.93615,.0.000,.-0.153,..9.807

지금까지 vb 스크립트는 훌륭한 작업을 수행하고 있지만 이제는 이 데이터를 실시간으로 표시해야 하므로 로그를 업데이트하는 동안 grep/cut/awk 명령을 사용하여 이 작업을 수행하는 스크립트가 있어야 하므로 그 이후에 파일을 엽니다. 완료되었습니다. libre-office에서 vbscript를 사용하는 것은 더 이상 좋지 않습니다.

어떤 제안이 있으십니까?

답변1

나는 내 접근 방식을 다시 생각해 보고 H기존 공간을 사용하는 것이 더 쉽고 강력할 것이라고 결정했습니다. 파일이 공백 대신 탭으로 구분된다고 언급했듯이 간단한 수정은 리터럴 공백 문자 대신 문자 클래스를 사용하는 것입니다. 하지만 클래스의 경우 약간 부피가 커지는 경향이 있기 때문에 일반적으로 클래스를 사용할 때 대체품으로 포장하는 것을 선호합니다. 또한 이를 쉘 함수로 래핑하여 간단한 명령으로 래핑하겠습니다.

여기 또 다른 점이 있습니다.

#!/bin/sh
robot() (s=[:blank:];LC_ALL=C \
    sed "s/^[$s].*[$s]//;s/\.\.*/./g
    /[$s][^i$]*[^1-9d]*[d$s]*/!{H;\$!d
    };   s//,/;x;s///;s/\n//g
         s/,\.\([-1-9]*\)0*//
         s//,\1/g;s//,+.\1/g" "$@" 
)
robot "$@"            

sed위에서 맨 위 줄과 맨 아래 줄을 제거하면 POSIX 호환 항목이 포함된 실행 중인 POSIX 호환 셸에 복사/붙여넣을 수 있습니다 . $PATH그렇지 않으면 위 내용을 그대로 작성할 수 있습니다 $PATH. . 좋다:INPUT| robotrobot <infilerobot infile1 infile[2-9] -

robot <<\DATA
20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, length 40
    0x0000:  4500 0044 68f7 4000 4011 25c7 8083 d0bf  E..Dh.@.@.%.....
    0x0010:  8083 da24 85b1 15b3 0030 1e8b 3132 3033  ...$.....0..1203
    0x0020:  3132 2e37 3836 3036 2c20 332c 2020 2030  12.78606,.3,...0
    0x0030:  2e31 3533 2c20 2d30 2e31 3533 2c20 2039  .153,.-0.153,..9
    0x0040:  2e39 3630                                .960
DATA

그리고 이전 버전이 인쇄됩니다 ...

20:06:57.049686,26871,.0.120312.78606,.3,.0.153,-0.153,.9.960

이 인쇄...

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960

이제 선두를 제거합니다.가리키다또는0 제로.3출력에 포함되지 않은 다양한 필드에서 이전에 얻은 허위 필드를 제거합니다 . 또한 +다음으로 시작하는 필드의 출력에 기호를 추가합니다.-스프린트.

어쩌면 너무 많은 일을 하고 있는 것일 수도 있습니다. 솔직히 말해서 이 모든 영역이 어떻게 조화를 이루어야 할지 모르겠습니다. 그것은 단지 최선의 추측일 뿐입니다. 아래에서 자세히 설명하려고 노력했지만 어떤 이유로든 다른 작업을 보고 싶다면 언제든지 문의해 주세요.

문자 클래스는 [:blank:]로케일에 정의된 가로 공백 문자와 일치하므로 공백이나 탭일 수 있으며 차이가 없습니다. 로케일을 고려하여 C여기에 로케일을 명시적으로 지정하기로 결정했습니다. 텍스트 처리를 수행할 때 항상 가장 현명한 방법이기 때문입니다. C로케일에서 각 입력 바이트는 단일 문자와 일치하는 것이 보장됩니다.sed(이런 일을 할 때 이것은 많은 의미를 가질 수 있습니다 .*). 그러나 함수에 정의된 모든 상태는 해당 함수에 대해서만 로컬이며 인쇄하는 것 외에는 실행 환경에 영향을 주지 않습니다 stdout.

흐름:

스크립트의 첫 번째 줄에서 sed처음부터 마지막까지의 문자 시퀀스가 ​​제거됩니다.[[:blank:]] 만약에줄은 1부터 시작합니다. 그런 다음 .dot일련의 s를 단일 s로 대체합니다 .dot.

다음 줄은 약간 털이 있습니다. 이는 s///스크립트에서 null이 아닌 마지막 주소를 참조하기 위해 null 주소를 사용하여 다단계 교체를 처리하는 데 사용되는 단일 주소입니다 .

/[$s][^i$]*[^d1-9]*[d$s]*/

오직틀림없이주소 일치 항목에 하나 이상의 공백이 있습니다. 일치 항목의 다른 모든 시퀀스0개 *이상의 발생- 따라서 공백이 전혀 포함되지 않은 줄과 일치할 수 없습니다. 이는 1로 시작하는 모든 줄에서 모든 공백을 제거했기 때문에 블록 헤더에만 일치한다는 것을 의미합니다.

그래서 내가 한 첫 번째 일은 헤더가 아닌 행과 비교하고 일치하지 않으면 H이전 공간에 배치하고 출력에서 ​​마지막이 아닌 행을 제거하는 것입니다. 따라서 여기의 마지막 줄은 스크립트의 나머지 부분에 대한 모든 블록 헤더와 함께 하나로 묶일 것입니다. 왜냐하면 여기서부터는 규칙이 적용되는 유일한 줄이기 때문입니다.!$!d!$$sed

해당 주소를 헤더 행과 비교합니다.

20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68)
  • [$s]- 첫 번째 공백과 일치합니다 IP.
  • [^i$]*- 성냥 64,[[:blank:]].
  • [^d1-9]* - matches the나`.
  • [d$s]*- 일치 d[[:blank:]]

그래서 이렇게 하면 s//,/이 모든 것이 쉼표로 대체됩니다. 이것은 선행과 일치할 수 없기 때문에 우리가 통과시킨 마지막 줄에는 영향을 미치지 않습니다 [[:blank:]]. 설사 그랬더라도 마지막 줄에 대해 인쇄된 유일한 사본은 H이전에서 우리를 기다리고 있는 것이기 때문에 어떤 변경도 중요하지 않습니다. 공간을 변경한 후 조치를 취하면 됩니다 x. 이것은 다음 명령입니다 - 그리고 그것은 보편적으로 적용됩니다 - 그래서 우리는 이제 다음과 같은 패턴 공간을 사용하고 있습니다...

20:06:57.049686,26871, offset 0, flags [DF], proto UDP (17), length 6\
8)\n40\nE.Dh.@.@.%.\n.$.0.1203\n12.78606,.3,.0\n.153,.-0.153,.9\n.960$

...이것은 H이전 블록 헤더와 그 이후의 모든 행에 적용된 편집 내용을 나타냅니다. 보시다시피 \n거기에 있는 ewline 이스케이프 문자로 구분됩니다.

이것을 긴 주소와 다시 비교해 보겠습니다.

  • [$s][[:blank:]]- 바로 앞에 나오는 첫 번째 항목과 일치합니다 offset.
  • [^i$]*- 항상 일치하지만 첫 번째 $문자 발생은 포함하지 않습니다.
  • [^d1-9]*- 일치합니다 .0..
  • [d$s]*- 전혀 일치하지 않습니다.

그러니 이전처럼 s///모두 지워주세요. 모든 \newlines 를 제거한 후 s/\n//g패턴 공간은 이제 다음과 같습니다.

20:06:57.049686,26871,120312.78606,.3,.0.153,.-0.153,.9.960

...이전 버전에서는 거의 그대로 남아 있습니다. 하지만 재귀적 일치에 관심이 있어서 몇 가지를 추가했습니다. 이렇게 하면 안 됩니다. 버그를 발견했기 때문에 더 잘할 수 있겠지만 마지막 부분은 두 번째 필터의 csv용 새 스크립트를 사용하면 더 잘할 수 있을 것입니다. 그래도 예제 입력에는 확실히 작동하고 아마도 더 많은 입력에 작동할 것입니다. 하지만 적용되지 않거나 적용되지만 기대에 미치지 못하는 경우 거부할 것이라고 생각했습니다. 위에 표시된 대로 마지막 두 줄을 쉽게 제거하여 이 답변을 확인할 때 허용된 것과 일치하는 출력을 얻을 수 있습니다.

s/,\.\([-1-9]*\)0*//

이렇게 하면 시퀀스의 첫 번째 항목이 제거됩니다.,반점그 다음에. 가리키다, 0개 이상-스프린트또는 0이 아닌 숫자에 뒤에 오는 0을 더한 값입니다. 그러면 ,.3출력에서 ​​해당 필드가 제거됩니다.

전역 플래그를 사용하여 두 번째로 적용 하고 다음과 같이 삭제하지 않고 g저장합니다 .\1s//,\1/

20:06:57.049686,26871,120312.78606,.0.153,.-0.153,.9.960

...입력하다...

20:06:57.049686,26871,120312.78606,.153,-.153,9.960

다시 한번 g전역적으로 적용하고 +.다음과 같은 것을 추가하면 s//,+./g읽을 패턴 공간이 추가로 수정됩니다.

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960

...이것은 다음 라인 사이클이 시작되기 stdout전에 자동으로 인쇄됩니다 .sed

실제로 여기까지 해본 독자가 있고 이전 버전이 무엇을 의미하는지 궁금하다면 편집 기록에서 해당 버전과 작동 방식에 대한 자세한 설명을 찾을 수 있습니다.

이 스크립트를 입력하면 전체 예제 입력은 다음과 같습니다.

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960
20:06:57.113591,26872,120312.83611,-.153,-.460,9.960
20:06:57.188105,26873,120312.88615,-.153,-.306,9.807
20:06:57.200719,26874,120312.93615,+.153,-.153,9.807

관련 정보