Awk - 未端接的正则表达式

时间:2011-09-28 13:54:08

标签: bash awk sh

我正在编写一个shell脚本,需要从文本文件中提取值,如下所示:

app.full.name /warfilelocation/ warfilename

我的shell脚本将遍历应用程序名称列表,并使用AWK提取位置或名称。我已经使用以下命令在命令行上测试了这个:     awk“\ $ 1~ / app.full.name / {print $ 2}”applications.txt

返回我期望的内容,但是当我把它放在shell脚本中时,我开始遇到问题。

我有一个看起来像这样的函数:

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 个答案:

答案 0 :(得分:6)

使用此方法使awk识别shell变量:

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

请注意,任何都可以进入shell变量, 甚至是一个完整的正则表达式,例如^d.*y。只需确保使用单引号 防止shell进行任何扩展。

答案 1 :(得分:0)

错误消息似乎表明$ application末尾有一个迷路换行符,它会给出“第2行”错误消息。

答案 2 :(得分:0)

看到这个:使用awk match()函数

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

答案 3 :(得分:0)

如果不确切知道$ 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 }"