看板 Linux 關於我們 聯絡資訊
我有一個檔案是記錄一些log的..檔名叫做Test_log 但是這檔案大於10mb,會把Test_log 存成Test_log1 之後再收到的log,會繼續存成新的Test_log 如果在有檔案在大餘10mb,就會將原本的Test_log1刪除,再將Test_log存成Test_log1 大約就是這個模式在記錄log... 我為了讓這個log都能保存下來...所以我寫了一個簡單的Script放在crontab 大概指令如下 cat Test_log Test_log1 > Test_long_log diff Test_log Test_long_log > Test_diff_log cp Test_long_log Test_long_log1 cat Test_diff_log Test_long_log1 >> Test_long_log 現在遇到一個問題 Test_long_log,檔案越來越大, 目前已經達到4gb了,所以我在windows也開不起來了 而這些log,都是記錄我一些sensor data,格式大約如下 2013-Oct-10 11:01:02 sensor1,sensor2,sensor3 2013-Oct-10 11:01:06 sensor1,sensor2,sensor3 2013-Oct-10 11:01:09 sensor1,sensor2,sensor3 . . . 2013-Oct-10 11:01:13 sensor1,sensor2,sensor3 因為這些sensor資料,我大約每個小時只需要一筆即可... 是否有機會依照小時去做資料擷取.. 或是更簡單一點,每100行,我只需要截取第一行即可... 是否有其他方式去讓我log能完整保留,因為如果真的可以每100行只保留一行 那我需要面對另一個問題是,如何算是哪個些資料是新增的,要將他寫入 Test_long_log 請網友幫幫忙..謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.255.20.252
kdjf:為什麼要寫入diff? 然後每100行存一個可以用sed 10/15 19:26
kdjf:還有,增加內容可用>>解決,一堆tmp file很慢又難看懂 10/15 19:42
Microscft:你直接更改syslog的設定比較快 把facility的level調高 10/15 20:07
Microscft:你覺得不需要記錄到log的就設定不要記錄 10/15 20:08
Microscft:或是把不同的訊息記錄丟到不同的log檔 10/15 20:09
Microscft:你這樣設定排程cat來cp去的 是在浪費系統資源 10/15 20:10
感謝 上面兩位回應... 因為原始程式會紀錄Test_log,這是原廠寫的,必須要存在,我無法變更或是修改 我只是希望另存成一個檔案去紀錄所有資訊...但是不需要全部記錄.. 可能每個小時,或是每100筆記錄一次即可... 增加內容的方式..我確實是用>>解決,寫入到Test_long_log , 但目前我想不到更好方式 去比較出Test_log新增的資料內容, 所以我只能用diff去比 抱歉..我現在查書...依然找不到sed如何每100行擷取一次 目前我只會用sed去做 取代 的用途..是否可以直接幫我說明..謝謝 ※ 編輯: zchien 來自: 111.255.20.252 (10/15 21:21)
yvb:sed -n '1~100p' ? 10/16 01:22
yvb:按你的描述, 似乎只要記錄 Test_log1 的第一筆, 供下次檢查, 10/16 02:17
yvb:就可以知道是不是新的 Test_log1 ... 10/16 02:17
yvb:也就是說, 若可等 Test_log 被轉存到 Test_log1 後再來處理, 10/16 02:26
yvb:那問題應該就簡單許多了吧 ?? 10/16 02:26
zchien:sed -n '1~100p' 只會擷取前一百行..和我需求不同 10/17 12:04
zchien:可等 Test_log 被轉存到 Test_log1 後再來處理...感謝提醒 10/17 12:05
zchien:這部分應該是比較簡單...只是我還是要用到cp和cat才能將 10/17 12:05
zchien:Test_log1存進去Test_long_log 10/17 12:06
rickieyang:awk '( NR%100==0 ){print $0}' Test_log1 10/17 12:57
rickieyang:while true; do tail -1 Test_log; sleep 3600; done 10/17 12:59
rickieyang:鬼遮眼. 不用{print $0}的... 10/17 13:10
rickieyang:awk '( NR%100==0 )' Test_log1 就好了 10/17 13:11
kdjf:1~100的思意和你相的不一樣喔... 那是sed address init~step 10/17 13:27
kdjf:sed -n '1~100p' Test_log1 >>Test_long_log 10/17 13:28
yvb:sed -n '1,100p' 才是前一百行. 10/17 13:30
yvb:sed -n '1~100p' 是每隔一百行, 從第一行開始. 10/17 13:31
kdjf:是說如果都在linux上了,可以用inotify()去看檔案有沒有被動到 10/17 14:42
yvb:若要用 inotify() 大概就要移駕 LinuxDev 板了 :P 10/17 16:58
yvb:翻回去忽然看到這句話: 10/17 19:25
yvb: 因為這些sensor資料,我大約每個小時只需要一筆即可... 10/17 19:26
yvb:意思就是, 其實只要一小時跑一次 cron job 10/17 19:27
yvb:而 cron job 就只要用 tail -1 抓最後一筆 Test_log 即可. 10/17 19:29
yvb: tail -1 Test_log >> Test_long_log 10/17 19:30
yvb:頂多, 加一點檢查, 看 Test_long_log 和 Test_log 的最後一行 10/17 19:35
yvb:如果相同, 就不要 append 到 Test_long_log. 10/17 19:35
yvb:咦, 原來11樓r大已寫了 tail, 只是我被那句 鬼遮眼 也給遮了:P 10/17 19:51
yvb:啊, 更上面其實還有6樓... 所以是 "編輯" 過後的11樓. 10/17 19:54
zchien:謝謝各位給我這些想法,等一下就試試 10/17 22:05
zchien:sed -n '1~100p’ 我電腦認不得1~100p意思 10/17 22:08
zchien:但每小時tail一次的方法可行,謝謝 10/17 22:09
yvb:'1~100p'不認得? sed --version 或 sed -V 看一下是什麼版本? 10/17 22:43