awk использует переменную командной строки

#variables #command-line #awk

#переменные #командная строка #awk

Вопрос:

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

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

пример строки, в которой она используется if($j ~ /mysearch/){ , это не работает при настройке условия поиска, но фактически выполняет поиск строки mysearch .

Ответ №1:

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

 $j ~ mysearch
  

Ответ №2:

Это не идеально, но я предлагаю написать скрипт 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 в измененном скрипте.

Ответ №3:

 $ cat input
tinky-winky
dipsy
laa-laa
noo-noo
po

$ teletubby='po'

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

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