알았어, 그래서 이걸 얻으려고 노력 중이야
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
향상에만 기여하므로 귀하에게 유리하게 작용할 것입니다 . 이는 매우 특정한 지점에서 입력을 받고 해당 지점 이후에는 입력을 소비하지 않으려 는 경우에만 정말 유용합니다 .sed
sed -u
q
sed
예를 들어:
printf %s\\n line1 line2 | {
sed -u =\;1q
sed =
}
...인쇄...
1
line1
1
line2
...하지만 -u
해당 플래그를 사용하지 않으면 그냥 인쇄됩니다...
1
line1
...첫 번째는 각 호출로 버퍼를 채우고 sed
두 번째가 이를 볼 기회를 갖기 전에 read()
전체 버퍼를 소비하기 때문입니다. 적당한 길이의 입력이 주어지면 한 줄에 한 번씩 실행되어야 하므로 처리 속도가 상당히 느려집니다.|pipe
sed
sed -u
sed
read()
그러나 이것은 귀하의 문제가 아닙니다.
당신의 문제는 당신이 너무 열심히 일한다는 것입니다. 하다:
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