2011-03-15 3 views
2

매일 로그와 다양한 텍스트 형식의 텍스트를 다양한 혼합 형식으로 추출해야합니다. 긴 bash/perl/python 스크립트를 작성하지 않고도 신속하게 작업을 수행하는 데 사용할 수있는 유틸리티 (예 : awk, grep 등)가 있습니까?여러 (중첩 된) 구분 기호를 사용하여 텍스트에서 값을 추출하는 방법

예 1 :

mylog user=UserName;password=Password;other=information 

아래에 입력 텍스트의 경우 I는 사용자 이름과 암호 값을 추출하고 싶습니다. 바람직하게는 다음과 같다 것이라고 의사 유틸리티 (awk) ;로 구분 입력 문자열 = 의해 $values 어레이에 배치되고, 그 배열의 각각의 값이 상기 범위가 정해지는

cat input-text.txt | magic --delimit-by=";" --then-by="=" 
    '{print "The username is $values[0][1] and password is $values[1][1]"}' 

가 형성 중첩 배열.

는 더 나은, 같은 것을 가지고 좋은 것입니다 : 구문 분석의 결과가 키에 의해 쉽게 조회에지도로 변환

cat input-text.txt | magic --map-entry-sep=";" --map-key-val-sep="=" 
    '{print "The username is $[user] and password is $[password]"}' 

.

예제 2 : 트리플 중첩 요소도 구문 분석하는 것이 좋을까요? 지금과 같이 사용 목록 mylist의 두번째 요소를 추출하고 싶습니다

mylog mylist=one,two,three;other=information 

같은 고려 텍스트를 입력 : 물론

cat input-text.txt | magic --delimit-by=";" --then-by="=" --and-then-by="," 
    '{print "The second element of mylist is: $values[0][1][1]}' 

는, 차라리 JSON 파서의 어떤 종류를 사용하여 입력 데이터를 변환하는 것 그것으로 쉽게 추출을위한 각각의 개체 /지도/목록 형식이지만, 다른 형식의 데이터로 작업하기 때문에 불가능합니다.

나는 보통 awk, grep, cut 및 sed 조합을 여러 파이프를 사용하여 결합하고 한 번에 관심있는 각 값 (열)을 추출하지만, 지루하고 여러 열을 나중에 하나로 병합해야합니다. 일반적으로 Excel에서 추가 처리를 위해 추출 된 모든 열을 CSV 형식으로 필요로합니다.

제안이나 의견에 감사드립니다.

답변

3
$ echo 'mylog user=UserName;password=Password;other=information' | 
    awk -F '[ ;]' -v keysep="=" \ 
     '{ 
       for (i=1; i<=NF; i++) { 
        split($i, t, keysep); 
        a[t[1]] = t[2] 
       }; 
     print "The username is " a["user"] " and password is " a["password"] 
     }' 
The username is UserName and password is Password 

$ echo 'mylog mylist=one,two,three;other=information' | awk -F "[ =,;]" '{print $4}' 
two 
+0

예를 들어, 필드 구분자로 공백을 놓친 다음 4 달러를 출력하십시오. –

+0

@glennjackman : 아니, 나는 단지 그것을 의도적으로 무시했다. 나는 대답에 그것을 추가 할 것이다. –

+0

+1 멋진 팁. 하나 이상의 문자로 구성된 문자열을 구분 기호로 사용하도록 확장 할 수 있습니까? 예 : 사용 ";" (공백 콜론)을 구분 기호로 사용하지만 공백이나 콜론을 구분하지 마십시오. – rodion

관련 문제