为awk编写shell包装器脚本

时间:2010-01-10 13:14:45

标签: shell awk

我想在shell脚本中嵌入一个awk脚本,但我很难这样做,因为我不知道在哪里结束语句;什么地方没有。

这是我的剧本

#!/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

顺便说一下,我正在使用nawk。

提前致谢

3 个答案:

答案 0 :(得分:5)

据我所知,有几件事是错误的:

  1. 您不会关闭分配给$awk的多行字符串。在END { ... }
  2. 之后,您需要在该行上使用单引号
  3. 您似乎无法在任何地方使用 $awk。也许你的意思是在do循环中调用awk。
  4. 一旦解决了这些问题,awk通常对分号相当宽容,但在这方面的任何问题都与在shell脚本中使用它没有任何关系。

答案 1 :(得分:3)

这三行:

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

list=$(ls $path)

for item in $list

需要改为:

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

for item in $path/*

如果文件名中有空格,并且ls不打算以这种方式使用。

答案 2 :(得分: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

你应该使用>>而不是>