리눅스 로그 파일 구조 변경, 비정상적인(?) sed 동작

리눅스 로그 파일 구조 변경, 비정상적인(?) sed 동작

알았어, 그래서 이걸 얻으려고 노력 중이야

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

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

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                                 

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

도착하다

E..Dh.@.@.%.....
  ...$.....0..1203
  12.78606,.3,...0
.153,.-0.153,..9
.960

등,

이 명령을 사용하세요

sed -u -e 's_0x0000:  4500 0044 68f7 4000 4011 25c7 8083 d0bf  __g;s_0x0010:  8083 da24 85b1 15b3 0030 1e8b 3132 3033__g;s_0x0030:  2e31 3533 2c20 2d30 2e34 3630 2c20 2039__g;s_0x0020:  3132 2e37 3836 3036 2c20 332c 2020 2030__g;s_0x0040:  2e39 3630__g' <tcpdump_log_sample_capture2.txt >out2

알겠어요

E..Dh.@.@.%.....
  ...$.....0..1203
  12.78606,.3,...0
0x0030:  2e31 3533 2c20 2d30 2e31 3533 2c20 2039  .153,.-0.153,..9
                                .960

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
  .153,.-0.460,..9
                                .960

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                                 

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

따라서 처음 5줄 중 0x0030으로 시작하는 네 번째 줄을 제외한 모든 줄에서 작동합니다.

두 번째 세트에서는 마지막 두 행에 대해서는 작동하지만 처음 세 행에는 작동하지 않으며 세 번째와 네 번째 세트에서는 작동하지 않습니다!

누군가 한 번 살펴보고 무슨 일이 일어나고 있는지 말해 줄 수 있나요? g 옵션을 사용하면 재귀적이어야 합니다!

(저는 sed(GNU sed) 4.2.2를 받았습니다)

답변1

고정 너비 필드와 함께 GNU Sed 사용

출력이 고정 너비 필드로 형식화된 것처럼 보이므로 원하는 데이터를 얻으려면 각 줄에서 처음 50자를 제거하면 됩니다. 예를 들어:

sed -r 's/^.{50}//' /tmp/corpus

답변2

열에 데이터가 포함된 텍스트 파일을 볼 때마다 다음을 고려하십시오 awk. 이 작업은 간단합니다 awk.

$ awk '{print $NF}' file 
E..Dh.@.@.%.....
...$.....0..1203
12.78606,.3,...0
.153,.-0.153,..9
.960

E..Dh.@.@.%.....
...$.....0..1203
12.83611,.3,..-0
.153,.-0.460,..9
.960

E..Dh.@.@.%.....
...$.....0..1203
12.88615,.3,..-0
.153,.-0.306,..9
.807

E..Dh.@.@.%.....
...$.....0(.1203
12.93615,.3,...0
.153,.-0.153,..9
.807

특수 변수는 NF현재 행의 필드 수입니다. 따라서 $NF행의 마지막 필드입니다. 스크립트 awk는 파일의 각 줄을 살펴보고 마지막 필드를 인쇄합니다.

perl원하는 경우 다음과 같이 할 수도 있습니다.

perl -lane 'print $F[$#F]' file

또는 GNU grep을 사용할 수도 있습니다.

grep -oP '.+\s\s*\K[^\s]+' file1

또는 sed어떤 이유로든 정말 메소드를 원한다면 GNU sed(또는 확장 정규식을 허용하는 다른 버전)를 사용하고 다음을 수행하세요.

 sed -r 's/.* +([^ ]+) *$/\1/' file

위 명령은 .* +하나 이상의 공백( )으로 끝나는 가장 긴 문자열을 찾은 다음 공백이 아닌 가장 긴 문자열( [^ ]+)을 찾은 다음 0개 이상의 공백(  *)을 찾고 전체 문자열을 캡처된 패턴으로 바꿉니다( 이것이 바로 괄호의 용도입니다). ). 그래도 파일에 공백이 아닌 경우에는 실패합니다. awk는 최고의 도구입니다.

답변3

사용하지 마십시오 sed -u. 생각한 대로 작동하지 않습니다. 모든 버퍼링은 처리 속도 sed향상에만 기여하므로 귀하에게 유리하게 작용할 것입니다 . 이는 매우 특정한 지점에서 입력을 받고 해당 지점 이후에는 입력을 소비하지 않으려 는 경우에만 정말 유용합니다 .sedsed -uqsed

예를 들어:

printf %s\\n line1 line2 | {
    sed -u =\;1q
    sed =
}

...인쇄...

1
line1
1
line2

...하지만 -u해당 플래그를 사용하지 않으면 그냥 인쇄됩니다...

1
line1

...첫 번째는 각 호출로 버퍼를 채우고 sed두 번째가 이를 볼 기회를 갖기 전에 read()전체 버퍼를 소비하기 때문입니다. 적당한 길이의 입력이 주어지면 한 줄에 한 번씩 실행되어야 하므로 처리 속도가 상당히 느려집니다.|pipesedsed -usedread()

그러나 이것은 귀하의 문제가 아닙니다.

당신의 문제는 당신이 너무 열심히 일한다는 것입니다. 하다:

sed 's/.* //' <infile >outfile

이렇게 하면 마지막 공백까지 포함하여 줄의 모든 내용이 삭제됩니다. 이렇게 하면 원하는 결과를 얻을 수 있습니다.

@CodeGnome 말이 맞습니다. 이것은 신뢰할 수 있는 접근 방식이 아닙니다. 표시되는 데이터에는 효과가 있지만 보다 안정적인 또 다른 접근 방식은 다음과 같습니다.

sed 's/   */\n/2;s/.*\n//'

이는 두 개 이상의 연속 공백이 두 번째로 나타나는 것을 줄 \n바꿈 문자로 바꾼 다음 그 앞의 모든 것을 삭제합니다. \n패턴 공간에서 ewline 문자를 얻는 유일한 방법은 sed거기에 넣는 것입니다.

답변4

당신은 이것을 해야 합니다:

paste  -d ""  <( awk {'print $10'}  yourfile )  <( cut -b 51 yourfile ) <( cut -b 52 yourfile ) <( cut -b 53 yourfile )  <( cut -b 54 yourfile )

출력은 다음과 같습니다

E..Dh.@.@.%.....E..D
...$.....0..1203...$
12.78606,.3,...012.7
.153,.-0.153,..9.153
.960

E..Dh.@.@.%.....E..D
...$.....0..1203...$
12.83611,.3,..-012.8
.153,.-0.460,..9.153
.960

E..Dh.@.@.%.....E..D
...$.....0..1203...$
12.88615,.3,..-012.8
.153,.-0.306,..9.153
.807

E..Dh.@.@.%.....E..D
...$.....0(.1203...$
12.93615,.3,...012.9
.153,.-0.153,..9.153
.807

관련 정보