2013-08-07 53 views
1

我目前正在處理AWK,我有三個變量和我一起工作: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 
+2

告訴我們您的awk代碼 –

回答

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 
+0

不正確。在logName = logName $ 2之後在$ logName上調用print命令只打印出filename。 :/ –

+0

@ S.T.A.L.K.E.R。你不應該使用'$ logName'。請參閱我的編輯 – Kent

+0

@ S.T.A.L.K.E.R。如果我是你,我會以這種方式得到字符串:'awk -F'\\。cpp |/| ''{print $ 2 $ 3}'' – Kent