2013-01-23 22 views
0

以下AWK代碼提取Java線程轉儲從日誌文件:AWK:結果寫入文件帶格式的名稱

# First thread dump line 
/^Full thread dump Java/  { 
     thread_dump=1; 
     counter++; 
     printf "Thread dump #%d\n", counter 
}   

# Last thread dump text block  
/^Heap[:space:]*$/ { 
     thread_dump=2; 
}    

# Last thread dump line 
{ if (thread_dump==2 && $0 ~ "^[:space:]*$") { 
     thread_dump=0; 
     printf "End of Thread dump #%d\n\n", counter; 
              } 
}          

# Print line only if in thread dump block 
{ if (thread_dump!=0) {print $0 } } 

awk -f extract.awk log.out的結果是這樣的:

Thread dump #1 
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.12-b01 mixed mode): 
... 
End of Thread dump #1 

Thread dump #2 
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.12-b01 mixed mode): 
... 
End of Thread dump #2 

我想要將每個線程轉儲寫入一個單獨的文件。文件名應該包含一些數據,如日期和連續ID,如thread_dump_002_2013_01_23_14_15

如何將print命令重定向到格式化文件名?

更新:

以下工作:

print $0 >"some_file_name.txt" 

但是,下面的:

print $0 > counter".txt" 

返回以下錯誤:

awk: syntax error at source line 25 source file extract.awk 
context is 
    { if (thread_dump!=0) { print $0 >>> >counter".txt" <<< } } 
awk: illegal statement at source line 26 source file extract.awk 

PS:我在Mac上使用AWK。

+0

正如我所說的使用第二種方法。 – Vijay

回答

1

只需在您的打印語句中添加>counter".txt"即可。 例如:

printf "Thread dump #%d\n", counter >counter".txt"; 

每個打印語句都應該如上所述附加上這個字符串。 然後嘗試運行awk腳本。

某些unix版本不支持此語法。您是否在該行的末尾添加了分號?

在這種情況下做到這一點:

file=counter".txt"; 
    printf "Thread dump #%d\n", counter >file; 
+0

awk:源代碼行的語法錯誤25源文件extract.awk。上下文是'{if(thread_dump!= 0){print $ 0 >>>> counter「.txt」<<<}}''。我在Mac上使用AWK - 是這個問題嗎? –

+0

unix donot的一些風格支持這種語法。請參閱我的編輯。 – Vijay