awk:无法连接字符串

时间:2013-08-07 19:08:59

标签: linux awk concatenation

我目前正在处理AWK,我有三个与我合作的变量:

  • $ 0变量 - 对于此示例,它等同于:

path/filename.cpp LOG_ERR << "error in this log" << e.what();

  • $ logName变量 - 我解析出了cpp文件的名称,即:

filename

  • $ 2变量 - 包含默认的第二个值:

LOG_ERR

问题:

我要做的是连接像这样的值:

logName=$logName $2;

但是我没有预期的值filenameLOG_ERR,而是得到了这个:

filename LOG_ERR << "error in this log" << e.what();

我做错了什么?

编辑:请求的AWK代码:

awk '{
logName=sub(/^.*\//,"",$1);
logName=sub(/\..*:/,"",$logName);

print $logName;
print $2;

logName=$logName $2;

print $logName;
}' $file

EDIT2:已修复。永远不要在awk中调用任何$变量,除非它是字段编号。 :)

awk '{
logName=$1;
sub(/^.*\//,"",logName);
sub(/\..*:/,"",logName);
print logName;
logName=logName $2;
print logName;
}' $file

1 个答案:

答案 0 :(得分:2)

logName=$logName $2;

这段代码错了。

您使用了$logName,这意味着列索引logName,显然它不是您想要的。

如果logName的值是字符串filename,则awk将尝试在此处获取列 $filename,如果未定义/分配变量,并且您尝试将其作为数字, awk会获得0。你可以测试一下:

kent$ echo "xxxx y y"|awk '{print $foo}'
xxxx y y

所以我想,修复将是:(如果logName设置正确值,正如您所说)

logName=logName $2;

修改

你永远不应该致电$logName查看这个例子:

kent$echo "111 222"|awk -v logName="filename" '{logName=logName $2;print logName}'                                                                             
filename222