我正在编写一个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
有没有人有任何想法我在这里做错了什么。我认为我没有逃避变量的正确,但无论我尝试它似乎都不起作用。
提前致谢
答案 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 }"