2010-01-10 3 views
2

쉘 스크립트 안에 awk 스크립트를 내장하고 싶습니다만, 다음과 같이 명령문을 어디에서 끝낼 지 모르기 때문에 그렇게해야합니다. 그리고 그렇지 않은 곳.awk 용 쉘 래퍼 스크립트 작성하기

여기 내 스크립트

나는 그런데 nawk 사용하고
#!/bin/sh 

awk=' 

BEGIN {FS = ",?+" } 

# removes all backspaces preceded by any char except _ 
function format() { 
    gsub("[^_]\b", "") 
} 

function getOptions() { 
    getline 
    format() 

    print 
} 

{ 
    format() 

    if ($0 ~ /^SYNOPSIS$/ { 
     getOptions() 
     next    
    } 

    if ($0 /^[ \t]+--?[A-Za-z0-9]+/) { 
     print $0 
    } 
} 

END { print "\n" }' 

path='/usr/share/man/man1' 
list=$(ls $path) 

for item in $list 
do 
    echo "Command: $item" 
    zcat $path$item | nroff -man | awk "$awk" 
done > opts 

입니다. 사전

+0

죄송합니다. 여기 혼란을 많이 겪어서 죄송합니다. ^^ ... 우선 스크립트의 잘못된 버전을 게시했습니다.이 스크립트는 현재 수정되었습니다 ... 두 번째로 스크립트가 작동합니다. -) ... 이유는 $ awk를 큰 따옴표로 묶는 것을 잊어 버렸습니다. 스크립트의 첫 번째 줄에 항상 구문 오류를주었습니다 ... – helpermethod

+0

답장을 보내 주셔서 감사합니다. 훌륭한 통찰력을 얻었습니다 ^^ – helpermethod

답변

5

는 멀리 볼 수있는, 잘못된 몇 가지가 있습니다

  1. 당신은 여러 줄 문자열이 $awk에 할당되는 닫지 마십시오. 당신은 당신이 실제로 사용$awk 어디하지 않는 것 END { ... }
  2. 다음 줄에 작은 따옴표가 필요합니다. 아마도 awk가 do 루프 안에 호출 된 것을 의미했을 것입니다.
  3. 일단 이러한 문제를 해결하면 awk은 일반적으로 세미콜론을 상당히 용인하지만 쉘 스크립트 내에서 사용하는 것과 관련된 문제는 없습니다.
1

에서

덕분에 난 당신이 무엇을 의미하는지 정말 잘 모르겠지만, 내가 제대로 이해한다면이

을 할 수 있도록, 당신의 showOpts.awk는, 스크립트의 시작 부분에 그 AWK 코드
path='/usr/share/man/man1' 
list=$(ls $path) 

for item in $list 
do 
    echo "Command: $item" 
    zcat $path$item | nroff -man | nawk ' BEGIN {FS = ",?+" } 
# removes all backspaces preceded by any char except _ 
function format() { 
    gsub("[^_]\b", "") 
} 

function getOptions() { 
    getline 
    format() 

    print 
} 

{ 
    format() 

    if ($0 ~ /^SYNOPSIS$/ { 
     getOptions() 
     next 
    } 

    if ($0 /^[ \t]+--?[A-Za-z0-9]+/) { 
     print $0 
    } 
} 

END { print "\n" } ' 
done >> opts 

그리고 아마도> 대신 >>를 사용해야합니다.

+3

나는 그걸 제안합니다. 리터럴 awk 프로그램을 루프에 포함 시키면 전체 쉘 스크립트를 읽기가 매우 어렵게 만듭니다. 변수에 먼저 할당하고 (OP가 시도한 것처럼) awk를 호출하면 $ awk "가 훨씬 더 읽기 쉽습니다. –

+2

리디렉션이 루프 외부에 있으므로 추가해야 할 이유가 없습니다. –

3

이 세 가지 라인 : 파일 이름에 공백이있는 경우

path='/usr/share/man/man1' 

for item in $path/* 

ls 때문에이 방법으로 사용할 수 없습니다 :

path='/usr/share/man/man1' 

list=$(ls $path) 

for item in $list 

필요성에 변경 될 수 있습니다.

+0

좋은 변화 후에,'$ path $ item'은 단지'$ item'이어야합니다. 또한 변수 확장을 따옴표로 묶어야합니다. 그래서,'zcat "$ item"| nroff-man | awk "$ awk"' –

+0

맞아, 고마워. –