1

我目前正在处理 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
4

1 回答 1

2
logName=$logName $2;

这段代码是错误的。

你用过$logName,表示列索引logName,显然不是你想要的。

如果值为logNamestring 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
于 2013-08-07T19:22:59.093 回答