awk использует переменную командной строки - PullRequest
1 голос
/ 15 октября 2011

awk -F, -f awkfile.awk -v mysearch="search term"

Я пытаюсь использовать указанную выше команду из терминала и использовать поиск в качестве поискового запроса в программе awk.Моя awk программа работает отлично, фактически назначая поисковый термин внутри программы, но мне интересно, как заставить поиск переменной использоваться?

пример строки, которую она использует в if($j ~ /mysearch/){, этоне работает при установке поискового запроса, но на самом деле ищет строку mysearch.

Ответы [ 3 ]

3 голосов
/ 15 октября 2011

Просто удалите косую черту:

$j ~ mysearch
0 голосов
/ 16 октября 2011
$ cat input
tinky-winky
dipsy
laa-laa
noo-noo
po

$ teletubby='po'

$ awk -v "regexp=$teletubby" '$0 ~ regexp' input
po

Обратите внимание, что все, что может войти в переменную оболочки, даже полноценное регулярное выражение, например, ^d.*y.Просто убедитесь, что используете одинарные кавычки, чтобы оболочка не выполняла никаких расширений.

0 голосов
/ 15 октября 2011

Это не идеально, но я предлагаю написать bash-скрипт, который принимает поисковый запрос, замените этот поисковый запрос в awk-скрипте, а затем запустите скрипт. Например:

$ cat dosearch.sh
sed "s/XXX/$1/" awktemplate.awk > awkfile.awk
awk -f awkfile.awk data.txt

$ cat awktemplate.awk
{
    j = 1
    if ($j ~ /XXX/) {
        # Do something, such as
        print "Found:", $0
    }
}

$ cat data.txt
foo here
bar there
xyz everywhere

$ ./dosearch.sh foo
Found: foo here

$ ./dosearch.sh bar
Found: bar there

В приведенном выше примере шаблон awk содержит «XXX» в качестве поискового термина, bash-скрипт заменяет этот поисковый термин первым параметром, а затем вызывает awk для измененного скрипта.

...