2011-09-28 2 views
0

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

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 

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

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

+0

Как вы называете эту функцию? Какова ценность приложения? –

ответ

6

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

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

Update

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

$ teletubby='po' 

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

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

+0

он хочет заполнить переменную значением в Regex. а не просто распечатать – Kent

+0

@ Kent - просто заявив, что '-v' позволяет использовать переменную оболочки в awk-скрипте. Затем эта переменная может использоваться как регулярное выражение в функции 'match()'; но эта часть, которую я забыл ... –

+0

Я думаю, что точка соответствует().поскольку переменная (по -v) не может использоваться в awk-сопоставлении, например, ($ x ~/here /). по крайней мере, я не знаю, как использовать в этом случае. :) – Kent

0

сообщения об ошибках, кажется, указывают, что есть шальная символ новой строки в конце $ приложения, что дает сообщения об ошибках «строка 2».

+0

Это не то же самое, он хочет проверить первое поле, то есть $ 1 ~/^ app/ –

+0

О, спасибо, не понял, что это настоящий синтаксис awk. Ред. – thiton

0

см эту: функцию, используя спичку AWK()

kent$ app=app.ful 
kent$ echo "app.full.name /warfilelocation/ warfilename"|awk -v a=$app '{if(match($1,a))print $2}' 
/warfilelocation/ 
0

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

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

Я хотел бы посмотреть на точное значение, которое вы имеете в $ приложения, и если она содержит /, избежать его.

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

$ export application=`echo foo/bar | sed -e 's;/;\\\\/;g'` 
$ awk "\$1 ~/^$application/ { print \$1 }" 
Смежные вопросы