Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为awk编写shell包装器脚本_Shell_Awk - Fatal编程技术网

为awk编写shell包装器脚本

为awk编写shell包装器脚本,shell,awk,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()

我想在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
顺便说一下,我在用纳克


提前感谢

我不太清楚您的意思,但如果我理解正确,您的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

您可能应该使用>>而不是>

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

  • 您不关闭分配给
    $awk
    的多行字符串。在
    END{…}
  • 您似乎没有在任何地方实际使用
    $awk
    。也许您的意思是在
    do
    循环中调用awk
  • 一旦您解决了这些问题,
    awk
    通常对分号相当宽容,但这方面的任何问题都与在shell脚本中使用分号无关
  • 这三条线:

    path='/usr/share/man/man1'
    
    list=$(ls $path)
    
    for item in $list
    
    需要更改为:

    path='/usr/share/man/man1'
    
    for item in $path/*
    

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

    我建议将文字awk程序嵌入循环中,这样会使整个shell脚本非常难以读取。首先将其分配给一个变量(就像OP试图做的那样),然后调用
    awk“$awk”
    更具可读性。因为重定向在循环之外,所以没有理由必须是一个附加。在这个良好的更改之后,
    $path$item
    应该只是
    $item
    。此外,还应引用变量展开式。所以,
    zcat“$item”| nroff-man | awk“$awk”
    很抱歉在这里造成了很多混乱^^。。。首先,我发布了错误的脚本版本,现在已经更正了。。。第二,脚本现在可以工作了:-)。。。原因是我忘了在双引号中加$awk,这总是在脚本的第一行给我一个语法错误…谢谢大家的回答,他们提供了很好的洞察力^^