2012-09-13 2 views
0

몇 가지 핵심 단어가있는 텍스트 파일이 거의 없습니다. 나는 그 파일들에서 몇 줄을 선택하고 그것을 파싱해야한다. 다음은 샘플 파일입니다. 나는 "고객"grep하고 파일에서 줄을 가져와.쉘 스크립트를 사용하여 텍스트 구문 분석

13 Sun Sep 9 12:14:38 2012 : [P] Reproducer has the 167 number 
13 Sun Sep 9 12:14:38 2012 : [P] Customer has the 12.14.19.9 
13 Sun Sep 9 12:14:38 2012 : [P] Customer has the 12.14.89.9 
13 Sun Sep 9 12:14:38 2012 : [P] Reproducer has the 170 number 
13 Sun Sep 9 12:14:38 2012 : [P] Customer has the 12.4.89.16 

나는 단지 고객이있는 라인을 선택하고 오직 타임 스탬프 (12시 14분 38초)과 번호 12.14.19.9을 파싱해야합니다. 여러 파일에 대해이 작업을 수행해야합니다. 모든 파일의 로그 구조는 동일합니다. 나는 아래의 oneliner를 사용하여이 작업을 수행했다.

grep Customer Neigh.log | cut -d " " -f 5- | cut -d ":" -f 1-4 | cut -d " " -f 1,8 

그러나 나는 이것을 쉘 스크립트 안에서 할 필요가있다. 어떻게해야합니까? 누구든지 도와 줄 수 있습니까?

감사

+0

* 이미 스크립트를 작성한 것으로 보입니다. Q : 정확히 무엇을해야하고, 아직하고 있지 않습니까? 이미 가지고있는 것 중에 무엇이 빠졌습니까? 그 밖의 무엇이 필요합니까? – paulsm4

+0

잘하고 있습니다.하지만 쉘 스크립트에서 파일 이름을 인자로주고 동일한 기능을 사용해야합니다. 쉘 스크립트를 사용하지 않았습니다. 그래서 쉘 스크립트에서이 작업을 수행하는 방법을 알고 싶었습니다. – user1667228

답변

0

한 가지 방법 :

for i in *.txt; do awk '/Customer/ { print $5, $NF > FILENAME".out" }' "$i"; done 

것은 당신이 BSD awk를 사용하는 경우 :

for i in *.txt; do awk '/Customer/ { out=FILENAME".out"; print $5, $NF > out }' "$i"; done 
1

확인 -

다음

quick'n'dirty 쉘 스크립트입니다 :

if [ $# -ne 1 ]; then 
    echo Please enter a filename 
else 
    awk '/Customer/ {print $5, " ", $12}' $1 
fi 

1) 첫 번째 라인 체크 #/명령 줄 인수하면 "$ #"입니다 1 인 경우 파일 이름을 입력하라는 메시지가 나타납니다.

2) "awk"스크립트는 "잘라 내기"대신 사용할 수 있습니다. 라인에 "고객"이 포함되어있는 경우에만 5 열과 12 열을 인쇄합니다.

3) "awk"명령의 끝에있는 $ 1은 파일 인수 인 쉘 인수 # 1입니다. GNU awk을 사용

+0

!!! 그것은 작동합니다! 어떻게 여러 파일에 대해이 루프 수 있습니다. 마찬가지로 변수 이름을 파일 이름으로 제공해야하며 각 파일에서 동일한 작업을 수행해야합니다. 기본적으로 인수의 수를 반복하고 각각의 출력을 별도의 출력 파일에 저장해야합니다. 당신은 혼자 도와주세요. 미리 감사드립니다. – user1667228

+0

여러 파일을 반복 할 필요가 없습니다. #/arguments 검사를 if [$ # -lt 1]로 변경하고 "$ 1"을 "$ *'"로 변경할 수 있습니다. 이렇게하면 하나의 명령에서 여러 개의 파일 .. 또는 와일드 카드를 지정할 수 있습니다. 도움이되는 답변을 찾으면 "upvote"라고 말하십시오. – paulsm4

+0

:) 완료! 감사 – user1667228

1

이 너무 여러 파일에 적용됩니다.

awk '$0~/Customer/{print $5,$12}' *.txt 
관련 문제