2013-02-04 79 views
0

我想處理一個日誌文件(使用C),其中數據由雙冒號「::」分隔。我認爲像awksed這樣的工具將會非常有效。但是,awk輸出值可能會傳遞給我的C變量嗎? 例如,一種日誌信息是這樣的:如何使用C實現高效地處理日誌文件

a::b::c::d 

和我有一個struct由4個int元件。如何將4個部分保存到結構元素中?
我想過使用strtok libary調用作爲另一種方式,但在調用它之前,我必須從大量日誌信息中挑選合適的行,這使我更多地考慮sedgrep
謝謝你的幫助。如果你有更好的選擇,那將是非常友善的分享它。

更新:我忘了強調上面提到的一切都是在運行時中完成的,包括「根據給定值對匹配行進行分類」,然後對其進行處理,然後存儲該值。 scanf很好,但是如果裏面有空格的值是string

回答

1

您可以隨時使用的工具的混合物。例如,假設您的日誌文件位於文件log.out中。

然後你可以使用grep選擇您感興趣的線路:

grep "^-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+::-\?[0-9]\+$" log.out 

你既可以直接保存爲其他文件,把它給你的程序:

grep ... | ./analyze_data 

假設您的程序名爲analyze_data。適當的錯誤檢查

scanf("%d::%d::%d::%d", &a, &b, &c, &d); 

當然:在程序的源代碼,只需從stdin讀取和存儲你想要的值。

+0

感謝您的幫助,但是如果我需要在運行時執行它並且日誌文件行包含帶有空格的描述字符串呢? – leowang

+0

如果日誌文件是另一個程序的輸出,那麼可以很容易地將它輸入到'grep'中。但是如果你真的想用C做所有事情,我可以幫助你。但是,從另一個答案的評論中,我看到你說過:'對於內部有空格的字符串值,scanf無法正常工作。那麼這些字符串是如何分隔的呢?用'::'? – Shahbaz

+0

是的,只是假定字符串值不會包含任何雙冒號。爲了更加準確,我有兩個函數('writelog'和'readlog')在一個日誌文件上運行。至於'writelog',我可以簡單地將其打開並將日誌追加到文件中。但是對於'readlog',我很困惑我應該如何整理匹配的'n'行,將這些元素一行一行地分開,並將它們分別存儲到'n'結構中。現在我正在使用'popen'並將命令'grep''logfile'傳遞給它,然後每次'getline'一行,但堅持如何分離元素。非常感謝您的回覆。 – leowang

1

我會遠離strtok,直到你真的需要它。這可以通過scanf完成。

scanf("%d::%d::%d::%d", &a, &b, &c, &d); 

而且,三個工具sedawkgrep,這真的取決於「整理出適合行」的細節。 grep適用於檢測值。 awksed是更強大的工具,但他們需要更多的時間學習(他們都是圖靈完全編程語言)。

+0

'grep'可以完成這項工作。我只需要整理包含給定值的行。 'awk'可以將輸入分成4部分('$ 1','$ 2' ...)。令人討厭的是我需要在運行時執行它,所以我可以將'$ 1'傳遞給'$ 4'來自定義變量嗎?忘記'int'。對於裏面有空格的字符串值,'scanf'不能正常工作。 – leowang

1

假設你有一個指針「S」具有4個整數字段結構和打開的文件「日誌文件」:

res = fscanf(logfile, "%d::%d::%d::%d", &s->field0, &s->field1, &s->field2, &s->field3); 
+0

不錯。我忘了它是一個結構。+1 –

+0

但是在日誌文件裏面有很多這樣的行 – leowang