Как написать сценарий awk?

Si entiendo lo que está tratando de hacer, está usando una herramienta demasiado poderosa para el trabajo. En lugar de generar una sesión tmuxdedicada solo para un solo script simple, ejecute ese script desde la línea de comando usandonohup&y disown.

nohup tdm DRT & disown
-4
20.08.2017, 09:29
3 ответа

What does an awk script expect its command line arguments to be? Why does it expect arg1 to be the input file?

awkПравила, основанные на шаблонах, требуют ввода. Когда начинается обработка этих частей вашей программы, awkначинает использовать аргументы в виде имен файлов (или стандартного ввода, если имена файлов не указаны ).

До этого шага вы можете делать все, что хотите, с заданными аргументами в блоке BEGIN.

Думаю, эти небольшие примеры помогут вам начать работу:

$ cat a.awk 
#!/usr/bin/awk -f
BEGIN {
        i=1
        while( i in ARGV )
                print ARGV[i++]
}

a.awkимеет только блок BEGINи не содержит правил, основанных на шаблонах. awkне нуждается в файлах и поэтому не использует данные аргументы в качестве имен файлов:

$./a.awk poit --zort -troz narf
poit
--zort
-troz
narf

Вам решать, что с ними делать.

Если вы хотите, чтобы файлы, основанные на шаблонах, обрабатывались в качестве аргументов, вам необходимо удалить все аргументы, которые вы использовали в блоке BEGIN:

$ cat b.awk 
#!/usr/bin/awk -f
BEGIN {
        if( ARGV[1] == "--tolower" ) { cmd = "tr A-Z a-z" ; delete ARGV[1] }
        else if( ARGV[1] == "--toupper" ) { cmd = "tr a-z A-Z" ; delete ARGV[1] }
        else cmd = "cat"
}
{
        print | cmd
}

Пример работы без опции:

$./b.awk a.awk
#!/usr/bin/awk -f
BEGIN {
        i=1
        while( i in ARGV )
                print ARGV[i++]
}

Пример работы с опцией --toupper:

$./b.awk --toupper a.awk
#!/USR/BIN/AWK -F
BEGIN {
        I=1
        WHILE( I IN ARGV )
                PRINT ARGV[I++]
}
4
28.01.2020, 05:19

AWK ожидает, что его аргументы будут либо текстом сценария, либо -f, за которым следует имя файла, содержащего запускаемый сценарий, в обоих случаях необязательно за которым следуют имена обрабатываемых файлов.

Это объясняет, почему вам нужно -fв строке shebang :без этого, AWK считает, что имя файла вашего скрипта само по себе является операторами AWK для запуска.

Что касается обработки аргументов, программа AWK может выполнять свою собственную обработку аргументов, если она того пожелает. Ваш скрипт не работает из-за строки {print $0}:, которая указывает интерпретатору читать каждую строку со своего ввода (файлов, названных в командной строке, поскольку вы указали некоторые )и обрабатывать их в соответствии с инструкции в блоке. Если вы удалите эту строку, вы не получите никаких ошибок. Вы можете обработать аргументы в BEGINи очистить ARGV, чтобы он содержал только входные файлы; тогда AWK не будет жаловаться.

Попытка полностью самостоятельно обрабатывать аргументы и ввод, вероятно, означала бы игнорирование многих вещей, которые делают AWK таким полезным; если вы хотите сделать это, вы можете использовать Perl.

(Обратите внимание, что обработка shebang означает, что вы можете хранить простые скрипты AWK в их именах файлов, что позволяет избежать поиска умных имен для скриптов — не то, чтобы кто-то должен это делать...)

6
28.01.2020, 05:19

Сценарий awkожидает, что его аргументы командной строки, отличные от -option, будут именами файлов, над которыми сценарий должен действовать (, если они не заданы, он действует на стандартном вводе ).

Таким образом, когда вы используете #!/usr/bin/awk -fв файле скрипта awk, это сообщает системе, что текст самого файла должен быть передан в awk -f.Любые другие аргументы командной строки будут интерпретироваться как входные файлы или как дополнительные флаги дляawk:

#!/usr/bin/awk -f

BEGIN {
    for (i in ARGV) {
        printf("ARGV[%d] = %s\n", i, ARGV[i]);
    }
    printf("var = %s\n", var);
}

$./script.awk -vvar=hello ~/.profile
ARGV[0] = awk
ARGV[1] = /home/kk/.profile
var = hello

Проверка командной строки на наличие опций заканчивается на первом аргументе, не являющемся опцией:

$./script.awk ~/.profile -vvar=hello
ARGV[2] = -vvar=hello
ARGV[0] = awk
ARGV[1] = /home/kk/.profile
var =

Для того, чтобы awkбыл полезен для чего-либо, ему нужны входные данные. Эти данные обычно поступают из одного или нескольких входных файлов, указанных в командной строке, или при отправке данных в стандартный входной поток.

Кроме блоков BEGINи END, каждый блок в скрипте awkбудет применяться к каждой записи (каждой строки по умолчанию )входных данных по очереди.

5
28.01.2020, 05:19

Теги

Похожие вопросы