Написание сценария оболочки оболочки для awk - PullRequest
2 голосов
/ 10 января 2010

Я хочу встроить сценарий 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 ]

5 голосов
/ 10 января 2010

Насколько я понимаю, есть несколько неправильных вещей:

  1. Вы не закрываете многострочную строку, присваиваемую $awk. Вам нужна одинарная кавычка в строке после END { ... }
  2. Вы, кажется, на самом деле не используете $awk где-либо. Возможно, вы имели в виду вызов awk внутри цикла do.
  3. Как только вы исправите эти проблемы, awk обычно довольно простителен с точки с запятой, но любые проблемы в этом отношении не имеют никакого отношения к использованию его внутри сценария оболочки.
3 голосов
/ 10 января 2010

Эти три строки:

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

list=$(ls $path)

for item in $list

Необходимо изменить на:

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

for item in $path/*

в случае наличия пробелов в именах файлов и, поскольку ls не предназначен для использования таким образом.

1 голос
/ 10 января 2010

Я не совсем уверен, что вы имели в виду, но если я вас правильно понимаю, ваш 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

и вам, вероятно, следует использовать >> вместо>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...