2011-08-10 2 views
1

매우 자세한 PHP 스크립트에 의해 생성 된 1000 초의 로그 파일이 있습니다. 나는 이러한 로그 파일을 처리하고 엑셀 시트를 (I CSV 형식을 생각하고) 생성하고 데이터를 다시보고해야sed/awk와 regex를 사용하여 로그 처리하기

###Unknown no of lines, which I want to ignore### 
================================================= 
$insert_vars['cdr_pkey']=17568 
$id<TAB>$g1<TAB>$i1<tab>rating1<TAB>$g2<TAB>$i2<tab>rating2 #<TAB>more $gX,$iX,$ratingX 
#numerical values of $id $g1 $i1 etc. separated by tab 
#numerical values of ---""--- 
#I do not know how many lines will be there (unique column is $id) 
================================================= 
###Unknown no of lines, which I want to ignore### 

을 다음과 같이 일반적인 구조입니다. 나는 엑셀에서 정말 나쁜,하지만 내가 좋아하는 뭔가를 출력 생각 :

cdr_pkey<TAB>id<TAB>g1<TAB>i1<TAB>rating1<TAB>g2<TAB>rating2 #and so on 
17568<TAB>1349<TAB>0.0004532<TAB>0.01320<TAB>2.014E-4<TAB>...#rest of numerical values 
17568<TAB>1364<TAB>...#values for id=1364 
17568<TAB>1321<TAB>...#values for id=1321 
... 
17569<TAB>1048<TAB>...#values for id=1048 
17569<TAB>1426<TAB>...#values for id=1426 
... 
... 

그래서 내 cdr_pkey는 시트의 고유 한 열이며, 각 $cdr_pkey, 나는이 각각 $g1,$i1,$rating1...의 자신의 세트를 가지고, 여러 $id의이
해당 형식을 테스트 한 후 을 입력하면을 Excel에서 읽을 수 있습니다. 이제는 1000 개의 모든 파일로 확장하려고합니다.
더 진행하는 방법을 모르겠습니다. 다음 단계는 무엇입니까?

+0

로그 파일 구조가 일치 grep -v 'id'
덕분에 최종 에코 파이프 (즉, 모든 로그 파일이 같은 순서로 같은 열을 포함)? 또한 하나의 출력 파일 또는 각 입력에 대해 하나의 파일을 원하십니까? – Tomalak

+0

예 로그 파일 구조가 일관됩니다. 그리고 나는 하나의 출력 파일을 원한다. 각 입력 파일은 고유 한'$ insert_vars [ 'cdr_pkey']'를 가질 것이며 모든 파일을'cdr_pkey'로 초기 열과 결합하고자합니다 @Tomalak : thanks – Sudhi

답변

3

다음 bash 스크립트는 원하는 것과 관련 될 수있는 작업을 수행합니다. <TAB>이라고했을 때 의미 한대로 매개 변수화되었습니다. 나는 당신이 아스키 탭 문자를 의미한다고 가정하지만, 로그가 너무 길어서 <TAB>을 철자하게하면 변수 $WHAT_DID_YOU_MEAN_BY_TAB을 적절하게 수정해야합니다. Right Thing ™을 수행하는이 스크립트에 대해서는 거의 없습니다. 전체 파일을 문자열 변수로 읽습니다. 로그 파일의 크기에 따라 가능하지 않을 수도 있습니다. 위쪽면에서 스크립트를 쉽게 수정하여 두 번의 패스를 수행 할 수 있습니다.

#!/bin/bash 

WHAT_DID_YOU_MEAN_BY_TAB='\t' 

if [[ $# -ne 1 ]] ; then echo "Requires one argument: the file to process" ; exit 1 ; fi 

FILENAME="$1" 

RELEVANT=$(sed -n '/^==*$/,/^==*$/p' "$FILENAME" | sed '1d' | head -n '-1') 
CDR_PKEY=$(echo "$RELEVANT" | \ 
    grep '$insert_vars\['"'cdr_pkey'\]" | \ 
    sed 's/.*=\(.*\)/\1/') 
echo "$RELEVANT" | sed '1,2d' | \ 
    sed "s/.*/${CDR_PKEY}$WHAT_DID_YOU_MEAN_BY_TAB\0/" 

다음 find 명령은 예를 사용하지만, 귀하의 경우 귀하의 로그가 어떻게 구성되어 있는지에 따라 달라집니다.

find . LOG_PATTERN -exec THIS_SCRIPT '{}' \;

마지막으로, 내가 출력의 CSV 헤더를 넣어의 문제를 무시했다. 이것은 대역 외에서 쉽게 수행됩니다.

(편집 :. 코멘트에 대한 논의를 반영하기 위해 스크립트를 업데이트)

+0

우수! '$ id \ t $ g1 \ t ... '를 한 번만 입력하면 이되므로을 넣습니다. 귀하의 스크립트를 기반으로 아래에 내 대답을 추가했습니다. 엄청 고마워 ! – Sudhi

+0

편집 내용을 올바르게 이해했다면'RELEVANT' 줄을'... sed '1d'...'에서'... sed 1,2d ...'로 변경할 수 있습니다. –

+0

만약 내가 그렇게한다면 (그리고'grep -v 'id ''를 제거하십시오.) 첫 번째'cdr_pkey '값을 얻지 못합니다.'id'값이 두 번째 열에서 시작됩니다. – Sudhi

1

편집 : 제임스 ... 1d ...에서 ... 1,2 ... 지난 echosed을 변경하고 grep -v 'id'을 삭제하는 트릭을 할 것을 알려줍니다.
작동하는지 확인하십시오. 그래서 아래에서 그것을 바꿉니다. 제임스 윌콕스에게 다시 한번 감사드립니다.


@James 스크립트를 기반으로 작성한 것입니다. 난 그냥 다시 제임스 윌콕스

WHAT_DID_YOU_MEAN_BY_TAB='\t' 

if [[ $# -lt 1 ]] ; then echo "Requires at least one argument: the files to process" ; exit 1 ; fi 

echo -e "key\tid\tg1\ti1\td1\tc1\tr1\tg2\ti2\td2\tc2\tr2\tg3\ti3\td3\tc3\tr3" 

for i in "[email protected]" 
do 
    FILENAME="$i" 
    RELEVANT=$(sed -n '/^==*$/,/^==*$/p' "$FILENAME" | sed '1d' | head -n '-1') 
    CDR_PKEY=$(echo "$RELEVANT" | \ 
     grep '$insert_vars\['"'cdr_pkey'\]" | \ 
     sed 's/.*=\(.*\)/\1/') 
    echo "$RELEVANT" | sed '1, 2d' | \ 
     sed "s/.*/${CDR_PKEY}$WHAT_DID_YOU_MEAN_BY_TAB\0/" 
    #the one with grep looked like :- 
    #echo "$RELEVANT" | sed '1d' | \ 
     #sed "s/.*/${CDR_PKEY}$WHAT_DID_YOU_MEAN_BY_TAB\0/" | grep -v 'id' 
done 
관련 문제