[問題] 請問資料擷取問題

看板Linux作者 (小建)時間12年前 (2013/10/15 19:19), 編輯推噓12(12026)
留言38則, 5人參與, 最新討論串1/1
我有一個檔案是記錄一些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

10/15 19:26, , 1F
為什麼要寫入diff? 然後每100行存一個可以用sed
10/15 19:26, 1F

10/15 19:42, , 2F
還有,增加內容可用>>解決,一堆tmp file很慢又難看懂
10/15 19:42, 2F

10/15 20:07, , 3F
你直接更改syslog的設定比較快 把facility的level調高
10/15 20:07, 3F

10/15 20:08, , 4F
你覺得不需要記錄到log的就設定不要記錄
10/15 20:08, 4F

10/15 20:09, , 5F
或是把不同的訊息記錄丟到不同的log檔
10/15 20:09, 5F

10/15 20:10, , 6F
你這樣設定排程cat來cp去的 是在浪費系統資源
10/15 20:10, 6F
感謝 上面兩位回應... 因為原始程式會紀錄Test_log,這是原廠寫的,必須要存在,我無法變更或是修改 我只是希望另存成一個檔案去紀錄所有資訊...但是不需要全部記錄.. 可能每個小時,或是每100筆記錄一次即可... 增加內容的方式..我確實是用>>解決,寫入到Test_long_log , 但目前我想不到更好方式 去比較出Test_log新增的資料內容, 所以我只能用diff去比 抱歉..我現在查書...依然找不到sed如何每100行擷取一次 目前我只會用sed去做 取代 的用途..是否可以直接幫我說明..謝謝 ※ 編輯: zchien 來自: 111.255.20.252 (10/15 21:21)

10/16 01:22, , 7F
sed -n '1~100p' ?
10/16 01:22, 7F

10/16 02:17, , 8F
按你的描述, 似乎只要記錄 Test_log1 的第一筆, 供下次檢查,
10/16 02:17, 8F

10/16 02:17, , 9F
就可以知道是不是新的 Test_log1 ...
10/16 02:17, 9F

10/16 02:26, , 10F
也就是說, 若可等 Test_log 被轉存到 Test_log1 後再來處理,
10/16 02:26, 10F

10/16 02:26, , 11F
那問題應該就簡單許多了吧 ??
10/16 02:26, 11F

10/17 12:04, , 12F
sed -n '1~100p' 只會擷取前一百行..和我需求不同
10/17 12:04, 12F

10/17 12:05, , 13F
可等 Test_log 被轉存到 Test_log1 後再來處理...感謝提醒
10/17 12:05, 13F

10/17 12:05, , 14F
這部分應該是比較簡單...只是我還是要用到cp和cat才能將
10/17 12:05, 14F

10/17 12:06, , 15F
Test_log1存進去Test_long_log
10/17 12:06, 15F

10/17 12:57, , 16F
awk '( NR%100==0 ){print $0}' Test_log1
10/17 12:57, 16F

10/17 12:59, , 17F
while true; do tail -1 Test_log; sleep 3600; done
10/17 12:59, 17F

10/17 13:10, , 18F
鬼遮眼. 不用{print $0}的...
10/17 13:10, 18F

10/17 13:11, , 19F
awk '( NR%100==0 )' Test_log1 就好了
10/17 13:11, 19F

10/17 13:27, , 20F
1~100的思意和你相的不一樣喔... 那是sed address init~step
10/17 13:27, 20F

10/17 13:28, , 21F
sed -n '1~100p' Test_log1 >>Test_long_log
10/17 13:28, 21F

10/17 13:30, , 22F
sed -n '1,100p' 才是前一百行.
10/17 13:30, 22F

10/17 13:31, , 23F
sed -n '1~100p' 是每隔一百行, 從第一行開始.
10/17 13:31, 23F

10/17 14:42, , 24F
是說如果都在linux上了,可以用inotify()去看檔案有沒有被動到
10/17 14:42, 24F

10/17 16:58, , 25F
若要用 inotify() 大概就要移駕 LinuxDev 板了 :P
10/17 16:58, 25F

10/17 19:25, , 26F
翻回去忽然看到這句話:
10/17 19:25, 26F

10/17 19:26, , 27F
因為這些sensor資料,我大約每個小時只需要一筆即可...
10/17 19:26, 27F

10/17 19:27, , 28F
意思就是, 其實只要一小時跑一次 cron job
10/17 19:27, 28F

10/17 19:29, , 29F
而 cron job 就只要用 tail -1 抓最後一筆 Test_log 即可.
10/17 19:29, 29F

10/17 19:30, , 30F
tail -1 Test_log >> Test_long_log
10/17 19:30, 30F

10/17 19:35, , 31F
頂多, 加一點檢查, 看 Test_long_log 和 Test_log 的最後一行
10/17 19:35, 31F

10/17 19:35, , 32F
如果相同, 就不要 append 到 Test_long_log.
10/17 19:35, 32F

10/17 19:51, , 33F
咦, 原來11樓r大已寫了 tail, 只是我被那句 鬼遮眼 也給遮了:P
10/17 19:51, 33F

10/17 19:54, , 34F
啊, 更上面其實還有6樓... 所以是 "編輯" 過後的11樓.
10/17 19:54, 34F

10/17 22:05, , 35F
謝謝各位給我這些想法,等一下就試試
10/17 22:05, 35F

10/17 22:08, , 36F
sed -n '1~100p’ 我電腦認不得1~100p意思
10/17 22:08, 36F

10/17 22:09, , 37F
但每小時tail一次的方法可行,謝謝
10/17 22:09, 37F

10/17 22:43, , 38F
'1~100p'不認得? sed --version 或 sed -V 看一下是什麼版本?
10/17 22:43, 38F
文章代碼(AID): #1INIJS0t (Linux)