2011-09-15 94 views
2

我試圖從日誌文件中提取數據並系統地組織它。我有大約9個日誌文件,大小約爲100mb。grep數據和輸出到文件

我想要做的是:從每個日誌文件中提取多個,並且對於每個提取的塊,我想創建一個新文件並將提取的數據保存到它。每個塊都有明確的開始和結束點。

基本上,我已經取得了一些進展,並能夠提取我需要的數據,但是,我試圖弄清楚如何爲每個匹配的塊創建一個新文件。

由於我的環境的限制,我無法使用像Python或Perl這樣的編程語言。所以請原諒那個混亂的命令。

我的命令迄今:

find Logs\ 13Sept/Log_00000000*.log -type f -exec \ 
sed -n '/LRE Starting chunk/,/LRE Ending chunk/p' {} \; | \ 
grep -v -A1 -B1 "Starting chunk" > Logs\ 13Sept/Chunks/test.txt 

LRE Starting chunkLRE Ending chunk是我的邊界。現在我的命令起作用了,但它將所有匹配的塊保存到一個文件(其大小變得越來越大)。

我該如何着手爲每個匹配創建一個新文件並將匹配的內容添加到文件中?請記住,每個文件可以包含多個塊,並且不限於每個文件一個塊。

+0

在每個匹配的文件中是否有一個塊或幾個?除了如何爲每個提取的塊生成文件名之外,它並不重要。我也正確解釋最終grep的意圖,你想刪除起始塊分隔符?如果是這樣,那麼-B1會如何呢?這將包括分隔符? – tripleee

+0

@triplee:grep命令可能有點亂,但我的意圖是在每個比賽結束時在開始處添加+1線和在+1線上添加。 –

+0

所以你想要前面的塊的最後一行,和這個塊的第一行,沒有別的?你仍應該澄清輸入的預期輸出和結構。 – tripleee

回答

1

嘗試是這樣的:

find Logs\ 13Sept/Log_00000000*.log -type f -print | while read file; do \ 
sed -n '/LRE Starting chunk/,/LRE Ending chunk/p' "$file" | \ 
grep -v -A1 -B1 "Starting chunk" > "Logs 13Sept/Chunks/$file.chunk.txt"; 
done 

這遍歷查找結果並執行對每個文件,然後創建的每個文件的一個$ file.chunk.txt。

+0

這個伎倆,歡呼聲。 –

1

也許這樣的事情?

find Logs\ 13Sept/Log_00000000*.log -type f -exec \ 
sed -n '/LRE Starting chunk/,/LRE Ending chunk/{;/LRE .*ing chunk/d;w\ 
'"{}.chunk"';}' {} \; 

這使用sed的w命令來寫入名爲(inputfile).chunk的文件。如果這是不可接受的,也許你可以使用sh -c'...'來傳遞一個小的shell腳本來包裝sed命令。 (或者是由於某種原因禁止使用shell腳本?)

0

也許你可以使用csplit來進行分割,然後截斷chunk末尾的輸出文件。

2

可能需要比sed更可編程的東西:我假設awk可用。

awk ' 
    /LRE Ending chunk/ {printing = 0} 
    printing {print > "chunk" n ".txt"} 
    /LRE Starting chunk/ {printing = 1; n++} 
' *.log