2017-12-14 3 views
1

그래서 나는 다음과 같은 항목이 포함 된 로그 파일이 명령 행에정규식 도움이

[STAT] - December 11, 2017 13:16:05.360 
.\something.cpp(99): [Text] Code::Open Port 1, baud 9600, parity 0, Stop bits 0, flow control 0 

[STAT] - December 11, 2017 13:20:24.637 
.\something\more\code.cpp(100): [log] 
fooBarBaz[32] = 32, 1, 2, 7, 3, 1092, 5, 196875, 6, 270592, 20, 196870, 8, 289, 30, 196867, 11, 1156, 5, 196875, 28, 278784, 5, 196874, 32, 266496, 30, 6866, 36, 147712, 5, 196874, 

[STAT] - December 11, 2017 13:20:40.939 
.\something\more\code.cpp(100): [log] 
fooBarBaz[8] = 8, 1, 2, 1, 31, 532992, 5, 196875, 

[STAT] - December 11, 2017 13:18:16.214 
.\something\more\code.cpp(100): [log] 
fooBarBaz[12] = 12, 1, 2, 2, 17, 296960, 10, 196872, 51, 1792, 50, 196878, 

를,이 작업을 수행 할 수 있습니다와 같은 출력을 생성

gawk -F', *' '/fooBarBaz\[[^0].*\]/ {for (f=5; f<=NF; f+=4) print $f | "sort -n" }' log 

이 :

3 
6 
8 
11 
17 
28 
31 
32 
36 
51 

나는 같은 일을 awk 스크립트를하고 싶습니다,하지만 내 노력은 지금까지하지 는 일이있다.

#!/usr/local/bin/gawk -f                                        

BEGIN { print "lines" 
     FS=", *"; 
     /fooBarBaz\[[^0].*\]/ 
} 
{ 
       {for (f=5; f<=NF; f+=4) print $f} 
     } 

나는 내 정규 표현식 문, 올바른 장소에 내 데이터에 있기 때문에 관련 실행 둔한 -f script.awk 인쇄 라인하지 생각하지 않습니다.

내가 뭘 잘못하고 있니?

tl; dr : fooBarBaz가 있고 [0]이 아닌 행에서 5 행부터 시작하여 4 행을 끝까지 구문 분석하려고합니다. GNU 최적화

+0

정규 표현식은 BEGIN 문이 아닌 두 번째'{'앞에 있어야합니다. – kvantour

+0

begin 문 밖으로 이동하면 여전히 \ something.cpp에있는 데이터가 선택됩니다. '흐름 제어 0 '은 5 번째 쉼표가되지만 그 점에 대해서는 신경 쓰지 않습니다. –

+0

리팩터링 된 스크립트는 다른 순서로 표현식이있는 것 같아서 정렬 할 파이프가 부족합니다. 왜 당신은 그것이 같은 결과를 가져올 것이라고 기대합니까? 질문 [편집]으로 수정할 수있는 복사/붙여 넣기 오류가 있습니까? – tripleee

답변

2

awk 솔루션 :

parse_digits.awk 스크립트

#!/bin/awk -f 

BEGIN{ 
    FS=", *"; 
    PROCINFO["sorted_in"]="@ind_num_asc"; 
    print "lines"; 
} 
/fooBarBaz\[[1-9]+[0-9]*\]/{ 
    for (i=5; i <= NF; i+=4) 
     if ($i != "") a[$i] 
} 
END{ 
    for (i in a) print i 
} 

사용법 :

awk -f parse_digits.awk inputfile 

출력 :

lines 
3 
6 
8 
11 
17 
28 
31 
32 
36 
51 
+0

니스! 무슨 일이 일어 났는지 설명해 주시겠습니까? –

+1

@RegisteredUser, 필요한 모든 자릿수는 배열'a' 인덱스 ('a [$ i]')로 캡처됩니다. 가장 중요한 행은'PROCINFO [ "sorted_in"] = "@ ind_num_asc"'입니다. 배열 인덱스를 오름차순으로 배열합니다 (따라서'| sort -n' 호출 할 필요가 없습니다) – RomanPerekhrest

+0

'/ fooBarBaz \ [[^0] + \] /''[10]'과 일치하지 않을 수 있습니다. OP는'/fooBarBaz\[[^0].*]에 만족 될'[0] '과 일치하지 않기를 바랍니다 \] /'. –