awk等命令處理文字日誌 資料 工作記錄兩則

2021-08-30 12:35:14 字數 3155 閱讀 1695

剛才為了選全站分類,尋找了小分鐘。想來靜心寫寫工作筆記,發篇blog還是挺麻煩,尤其對我這個懶人。為了子文為了堅持,忍耐下吧。

下面的文字,是小申工作的筆記。處理文字log的兩次記錄,備忘以後方便查詢。這塊我是剛入門的同學,應用也比較簡單,高手看到之後,多多指教。

1、處理一:

[quote]

資料檔案一:log_1.txt

[2010-03-04 07:29:02] [30789][visit:g.php][use:1101]

[2010-03-04 07:29:02] [474330][visit:g.php][use:1001]

[2010-03-04 07:29:02] [57159][visit:g.php][use:10201]

……n+1條

[時間] [使用者id][visit:g.php][use:訪問時候的引數]

[/quote]

分別是要提取「使用者id」和「訪問時候的引數」,這兩項。

處理:這裡用 awk[url]來處理。

用到awk中 (-f)這個引數:

a、單獨提取使用者id:

~$:awk -f' \\[' '' log_1.txt>ret_1.txt

or:~$:awk -f'[' '' log_1.txt>ret_1.txt

解釋:命令一使用' '空格加'['做分隔符號,在'['前加上兩個'\\'轉一下。

命令二直接使用'[',所以列印的時候,列印的是 $3,

b、單獨提取使用者攜帶的引數,用'use:'做引數就可以了。

c、同時提取,多次使用awk,如:

~$:awk -f'\\]\\[visit:get.php\\]\\[use:' '' log_1.txt|awk -f' \\[' ''|head

總結三點:

a、awk的 -f 引數,一些特殊符號,用兩個'\\'轉。

b、處理部分,'',外面單引號,裡面雙引號。系統變數用單引號括起來,雙引號被解釋成是字串。(不一定正確,但不會報錯,哈哈),裡面的內建函式 int()等,更多函式可以google awk 內建函式。

c、對於printf(),其實括號也可以不要的。裡面的格式,用字串拼湊:($1" "int($2)"\n"),也可以用c那種("%d\n",$2)。看怎麼樣方便。

2、處理二:

[quote]

log資料二:log_2.txt

10002 2010-01-09 15:08:16

10013 2010-01-21 11:55:34

10075 2010-01-28 16:22:54

……格式:【使用者id 年-月-日 時-分-秒】

[/quote]

做什麼呢,不急,這是使用者參與a活動的資料,這裡還有第二份資料——使用者參與b活動的資料。但在orale裡面,

要求對比出提取出先參與活動a在參與b,或者是先參與b在參與a的兩分使用者id資料(使用者可以多次參與活動)。

to do:

a、從orale裡面匯出資料:

[quote]

~$:sqlplus 伺服器/使用者名稱@密碼

sql: set heading off;

sql: set trimout on;

sql: set trimspool on;

sql: set feedback off;

spool 最終生成的檔案;//這裡我們得到 'log_3.txt'

說明可以看看這裡 [url]

[/quote]

在接下來的命令中輸入sql語句,這裡沒有什麼好注意的,orale中,幾個用在sql中的函式很有用,比如,這裡,我們有乙個欄位是時間的,在orale以內部時間來儲存,我們要到處為固定格式,可以用to_char()函式,我們這裡在資料庫裡面的時間欄位為timestamp。那麼

[quote]

sql:

select distinct uid,[color=red]to_char[/color]( timestamp, 'yyyy-mm-dd hh24:mi:ss' ) from ……

[/quote]

這樣,得到乙份和log_2.txt一樣的log檔案。

b、對於,log_3.txt,有需要處理的部分,如,前面的sql語句和中間的空行,可以用下面的語句去除空行

~$:sed '/^$/d' file

or_~$:awk '/./ ' file

or_~$:grep -v '^$' file

c、對於 log_2.txt和log_3.txt 因為使用者可以多次參與活動,我們要做的是排序去重。

~$:sort -d file|uniq>file_ret

d、現在檔案,排好續了,用jion可以把兩個檔案重合的部分得出來。但如何比較時間呢。之前我的想法是把檔案中時間按部分轉化為時間戳。但嘗試了下,有點麻煩,沒有現成的函式。倒是awk中,在printf的時候,用 strftime("%y%m%d",$n)把時間戳轉化為格式化字串,反過來有點麻煩,請有經驗的同學,指導一下。最後的做法是直接對比時間那兩個字串,awk提供字串直接對比。

[quote]

格式:【使用者id 年-月-日 時-分-秒】

[/quote]

因為時間中間用空格分開了,比較的時候有點麻煩,先awk一下,把兩個字元段,連線起來。

~$:awk '' file

在jion就能得到這樣的檔案了

[quote]

2079 2010-02-02_12:14:55 2010-01-28_10:40:12

2090 2010-02-15_20:06:28 2010-02-01_20:50:32

2091 2010-03-05_16:38:59 2010-02-18_03:27:44

[/quote]

e、最後在執行比較的操作:

~$:awk '' file>last_file

感覺沒有什麼好總結的了,記著備忘。

end.

awk 命令在處理文字中的應用

awk命令在處理文字中很方便,最近總結了一些awk的具體應用。1 awk引數介紹 先寫乙個常用命令 cat 4653 trans out awk f f 是文字中的每一行按逗號分割 0 是文字中的每一行 1 是文字中每一行切割後的第乙個字段 awk內建變數介紹 記錄變數 fs field separ...

shell程式設計 文字處理利器awk命令(一)

awk是一種處理文字資料的程式語言,它的設計使它非常適合於處理由行和列組成的文字資料。1 基本語法 awk pattern 以上語法表示當某個文字行符合pattern指定的匹配規則時,執行actions所執行的操作。兩者必須保證有乙個,如果省略pattern則表示對所有的文字行執行actions所表...

shell程式設計 文字處理利器awk命令(二)

1 算術運算子 與其他程式語言基本相同,支援浮點數計算,x 5 2,print x直接輸出計算結果 2 賦值運算子 3 條件運算子 expression?value1 value2 eg.grade 2 90?a b print grade 4 邏輯運算子 2 80 3 80 4 80 5 80 輸...