sed 's/[^0-9]*//g'
означает удаление цифр, отличных от -.
Пример
echo alsal34las | sed sed 's/[^0-9]*//g'
получит34
Если вы хотите узнать больше об этом, я предлагаю вам взглянуть на регулярное выражение .
Хотя awk предоставляет вам аргументы, вам решать, как манипулировать ими, чтобы получить то, что вы в конечном итоге хотите получить. Например, просто установите аргумент пустым:
if (ARGC>1) {a=ARGV[1]; ARGV[1]=""}
else a=5
В противном случае аргументы имеют свою обычную функцию, которая для параметров, отличных от -, должна быть входными именами файлов. Таким образом, awk попытается прочитать файл «2» и запустить на нем тело скрипта.
Когда вы передаете аргумент в awk в командной строке, он предполагает, что вы передаете ему файл, и пытается открыть его. Я действительно не понимаю, чего вы ожидали, так обычно ведет себя awk.
Причина, по которой это работает, если вы удалите { print }
, также довольно проста. Если вы удалите его, у вас не останется ничего, кроме блока BEGIN{}
, который запускается до того, как будут прочитаны какие-либо входные файлы. Поскольку кроме BEGIN{}
ничего нет, нет смысла даже пытаться прочитать файл, и программа завершает работу. В этом легко убедиться с помощьюstrace
:
$ strace awk 'BEGIN{a=1}{print}' somefile |& grep 'open.*somefile'
openat(AT_FDCWD, "somefile", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "cannot open file `somefile' for "..., 66cannot open file `somefile' for reading: No such file or directory) = 66
Сравните приведенное выше с:
$ strace awk 'BEGIN{a=1}' somefile |& grep 'open.*somefile'
$
Поскольку с файлом ничего не поделаешь, попытка открыть его не предпринимается.
Я думаю, что вы ищете формат foo=bar
, который позволяет вам передавать переменную в командной строке:
ls -l|./t.awk a=2
Затем измените свой скрипт на этот:
#!/bin/awk -f
BEGIN {
if (!a){
a=5
}
}
{
print a,$0
}
И чтобы проиллюстрировать, как это работает:
$ echo foo | t.awk ## default value
5 foo
$ echo foo | foo.awk a=12 ## value given at launch
12 foo
Кроме того, при запуске непосредственно из командной строки вы также можете использовать параметр -v
, чтобы сделать то же самое:
$ awk -v a=12 'BEGIN{print a}'
12