Awk - неопределенное регулярное выражение - PullRequest
0 голосов
/ 28 сентября 2011

Я пишу сценарий оболочки, который должен извлечь значения из текстового файла, который выглядит следующим образом:

app.full.name /warfilelocation/ warfilename

Мой сценарий оболочки будет перебирать список имен приложений и извлекать либо местоположение, либо имя с помощью AWK. Я проверил это в командной строке, используя следующее: awk "\ $ 1 ~ / app.full.name / {print $ 2}" Applications.txt

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

У меня есть функция, которая выглядит следующим образом:

function get_location() {
        local application=$1
        awk "\$1 ~/^$application/ { print \$2 }"  applications.txt 
}

Но когда я вызываю эту функцию, я получаю следующую ошибку:

awk: $1 ~/^app.full.name
awk:      ^ unterminated regexp
awk: cmd. line:1: app.full.name
awk: cmd. line:1:         ^ syntax error
awk: cmd. line:2: app.full.name/ { print $2 }
awk: cmd. line:2:    ^ syntax error

У кого-нибудь есть идеи, что я здесь делаю неправильно? Я предполагаю, что я не экранирую правильную переменную, но независимо от того, что я пытаюсь, это, кажется, не работает.

Заранее спасибо

Ответы [ 4 ]

6 голосов
/ 28 сентября 2011

Используйте этот подход, чтобы awk распознал переменные оболочки:

awk -v "v1=$VAR1" -v "v2=$VAR2" '{print v1, v2}' input_file

Обновление

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

$ teletubby='po'

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

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

0 голосов
/ 28 сентября 2011

Трудно сказать, не зная точно значения $ application, но кажется, что у вас есть странный символ в $ application, такой как "или / или что-то в этом роде.

$ export application=foo/bar
$ awk "\$1 ~/^$application/ { print \$1 }"
gawk: cmd. line:1: $1 ~/^foo/bar/ { print $1 }
gawk: cmd. line:1:                ^ parse error

Я бы посмотрел на точное значение, которое вы имеете в $ application, и, если оно содержит /, экранируйте его.

Один из способов сделать это - использовать:

$ export application=`echo foo/bar | sed -e 's;/;\\\\/;g'`
$ awk "\$1 ~/^$application/ { print \$1 }"
0 голосов
/ 28 сентября 2011

смотрите это: используя функцию awk match ()

kent$  app=app.ful
kent$  echo "app.full.name /warfilelocation/ warfilename"|awk -v a=$app '{if(match($1,a))print $2}' 
/warfilelocation/
0 голосов
/ 28 сентября 2011

Похоже, что сообщения об ошибках указывают на то, что в конце $ application находится случайный символ новой строки, который выдает сообщения об ошибке "line 2".

...