Jump to...
redirecting...

Log for Ubuntu 台灣社群

問個 awk 問題
我要怎麼在 行1 抓 行2 出來
因為我需要算時間差
但是 log 是跨兩行的
jabascript
需求越來越複雜就要寫 script file
那就找一個好寫一點的 script lang ㄅ
其實 bash 都可以
不限定 awk
因為很多筆
兩行存成變數再處理
要算登入登出時間差
但是又有其他狀況要排除
你要處理 log 的機器到底是什麼系統
如果是 ubuntu,真的建議 python 下去…
我這邊只剩 windows + cygwin ………
Alpine 的話…
還是誰有提供 windows 解決方案(攤手
你有 Windows 但堅持用 bash 處理幹麻…
試過 getline 嗎
我還以為是什麼奇怪的環境不允許安裝其他 script lang
是喔
其實 Python應該可以(?
可是我不會(囧
沒關係 反正看起來你 bash 也不太會
都學
不會,都不會(逃
awk '/title 2/{print $0; getline; print $0}' test.txt
假設搜行一字串 title 2
沒有辦法
只會跑後面的 print,前面的沒作用
[sticker](media:AAQFABPd8LEyAAQuCKJkW0mqkhEZAAIC@telegram)
我該改信 Python 教了嗎
search="title 2"; awk -v x="$search" '$0~x {print $0; getline; print $0}' test.txt
改這樣呢?
你遲早要對兩個變數另外處理阿
又不好丟給 pipe
改信 Python ㄌ
那… bash 都沒賺到東西
那如果改這樣呢?
found=$(search="title 2"; awk -v x="$search" '$0~x {getline nextline; print $0 ", " nextline}' test.txt); echo $found
再對 found 做 split
算了,如果改信教了,就當我沒說
我覺得不管哪個都好累(囧
大家都不熟
看來你還是自己寫一套工具好了,最直觀輕鬆(?
還是配合sed用?
ㄎㄅ,我以爲你是故意不要用 sed
想說可能是神奇的系統有 awk 沒 sed 之類的
沒有啊XD
我只是不知道該怎麼配合
XD
awk 有 NR 可以取得行號
sed 有 sed 'LineNumberq;d' 可以篩出指定行的資料
資料大概這樣
原來有附測資
阿nodejs
正常是一個 OUT_ADM
配一個 IN
例外狀態是 要排除多的OUT_ADM
或是IN
抓最早的OUT跟最晚的IN
成對
我想到的是
用 if 抓 OUT 然後再去抓IN
中間丟給 awk 去算
還是這裡有C專家(x
我看不懂你的需求,不過比較時間一般都會轉成 timestamp 對吧?這坨可以取得 Line 1 的前面 datetime 的對應 timestamp
sed '1q;d' time.txt | cut -c 1-19 | while read datetime; do date -d "$datetime" +"%s"; done
我更不熟
那你會啥
vb嗎
我會安裝 gentoo

我不會
嗚嗚嗚嗚
至少沒試過
或者你可以把 log 建成資料庫再用 sql 去撈(X
我要算出同一使用者登入登出的時間差後加總
我要算出同一使用者登入登出的時間差後加總
簡單來說
計算登入持續時間
請用正常的程式語言寫
你這樣講的好像 awk 不正常
它不是程式語言
第一句
[sticker](media:AAQFABNDpd8yAATUDKXoP8lAx0IkAAIC@telegram)
[sticker](media:AAQFABNc8a4yAARcoLGy2cCAWcWxAQABAg@telegram)
我好像知道怎麼做ㄌ
先來睡覺
棒ㄛ
我記得不會有兩次IN的紀錄
所以OUT抓到後
直接去找IN
中間就跳過
再重複這樣
然後算時間
這裡用 awk 輸出吧
然後丟到 shell 變數去(?
對,其實並不難
只是要設定 NR,否則以測資來說,搜 QRA 會導致在線時間爲負
因爲 log 裡先找到登出的
喔喔喔
那個資料粉奇怪捏
OUT是登入
IN是登出
不知道為什麼
那應該是從中間抓一段出來而已吧
前面登入的不在擷取範圍中
然後我已經照使用者都切開了
所以不會有使用這名稱的問題
不知道
可是每一筆透視 OUT開頭的
時間上也合理
阿哉,你的系統你都不知道了
先來休息
等等再想
當然不是我的囧
好吧
[sticker](media:AAQFABNVpbMyAAQ8VZqpQQ9uKoAXAAIC@telegram)
我要道歉
getline 是有效的
我變數打錯
難怪出不來
說來討論看看啊
沒了沒了
還是改回信 awk
C 的字串處理好麻煩(O
我覺得第一選擇用 awk 也是蠻… 稀有的
畢竟通常能用更高階的更方便的東西就用
會用到 bash 指令要嘛簡單的小事 要嘛環境不允許
靠北哦www
[sticker](media:AAQCABPTvV8PAATp-1cQ30hmAqc7AAIC@telegram)
我也很好奇怎麼會第一選擇 awk...
我看很多人都是想著怎麼用 sed + grep 之類的組合搞定
+1
as tmp.log

( SORTED_DATA=`cat tmp.log | sort -k4 -k3 -k1 -k2`; KEY=`echo "$SORTED_DATA" | awk '{print $NF}' | uniq`; echo "$KEY" | ( while read k; do ENTRYS=`echo "$SORTED_DATA" | grep $k`; RESULT_IN=`echo "$ENTRYS" | grep IN: | tail -n1`; RESULT_OUT=`echo "$ENTRYS" | grep OUT_ADM: | head -n1`; RESULT=`echo "${RESULT_OUT}\n${RESULT_IN}"`; [ -n "$RESULT_IN" ] && IN_TIME=`date -d "$(echo "$RESULT_IN" | awk '{print $1" "$2}')" +"%s"`; [ -n "$RESULT_OUT" ] && OUT_TIME=`date -d "$(echo "$RESULT_OUT" | awk '{print $1" "$2}')" +"%s"`; [ -n "IN_TIME" ] && [ -n "$OUT_TIME" ] && TIMEDIFF=$(( $IN_TIME - $OUT_TIME )) || TIMEDIFF="n/a"; echo "User: $k's logs: $TIMEDIFF seconds\n$RESULT"; done ) )


results:
User: PI2's logs: n/a seconds

2019/05/02 03:07:55 IN: PI2
User: QRA's logs: 3836 seconds
2019/04/30 17:30:37 OUT_ADM: QRA
2019/04/30 18:34:33 IN: QRA
User: systemdbuser's logs: 14402 seconds
2019/04/30 18:00:00 OUT_ADM: systemdbuser
2019/04/30 22:00:02 IN: systemdbuser
[photo](media:AgADBQADoagxG8V14VbhX6yaIXr7VgABTPYyAAT_hzxl53YBRFZ2AwABAg@telegram)
什麼鬼
也太長了
讓我看看
我看到好多 pipe
我… 只能跪了www
至少沒吐槽我好多 var (X
就一整個一行完成全部需求的概念 (X
好多 var 沒什麼問題啊,這樣還方便修改
不過硬要單行完成就是滿滿的惡意了(X
我單純沒開檔案寫 bash 啦
要開也行,沒很困難xDDD
就只是偷懶而已
非常明白這種想法XD
懶的切換兩個視窗,或者即便都是用終端機也懶的換來換去
所以 @HybridGlucose 你有看完嗎xDD?
需要我拆成檔案嗎?
還是這個沒完全符合需求xDD?
其實是我自己有寫好一半
但也只有一半 (X
我還是希望自己做啦XDD
不過看起來大神在這邊
我想問是
有什麼辦法可以做到
抓到 key1 之後去找 key2
最省腦力的方法就是把 key 先 uniq 出來,然後再一個個抓 (X
我現在的會變成
key1
key1
key2
輸出變成
key1 key2
key1 key2
預期應該只要有一行
我等等給你看圖好了
好呦
因為我要先過濾出時間
才能做計算
awk好像可以直接算時間?
雖然我可以很不負責任的讓時間多算一次(#
不過我還是想處理好
你到時候要給圖的時候
還是直接先用手打幾個範例輸入輸出
感覺比較能抓到你想要哪些動作
[photo](media:AgADBQAD3KgxG3LV4VZcY3YkfgABOXvATvYyAAS_Jbyo3as83MZ4AwABAg@telegram)
[photo](media:AgADBQADpagxG8V14VZIhXLPgta2Pgft3zIABHST19TEd6DkA30DAAEC@telegram)
所以其實是要抓同名的下一筆 out 之前的最後一筆 in 吧
那這樣這個沒考慮這問題,所以不適用xDD
我這邊直接跑怪怪的
因為我只看頭尾啊,我沒管中間的xDDD
XD
我看了一下
應該跟 next 擺的位置有關係
你 next 應該會比較怕的是中間有插其他 id 的問題吧
不會
我切開了
喔喔,那應該還好
所以單一檔案只會有一個使用者
那這樣情境似乎更簡單了,用 OUT 當分隔符,然後切開後的第一筆就是 OUT 然後你只要直接抓最後一筆的 IN 就好
我等等看看
可是這樣我要怎麼抓 IN 的時間欄位
date -d "`echo "$line" | awk '{print $1" "$2}'"` (X
誒XD
[photo](media:AgADBQADq6gxG8V14VYmVTu0MOAZSC553zIABMkao4CiqQK8CXIEAAEC@telegram)
第二行只會有1個 欄位啦
這樣怎麼切XD
[sticker](media:AAQFABO-j8oyAATxr7o8mBxJjBBNAAIC@telegram)
暫時想不到解法,打結中
可ㄅ可以給個比較完整的 txt 玩玩w
給我mail
我附上我寫的跟原始資料
你也需要一份ㄇ
你也需要一份ㄇ
好呦
我決定放棄ㄌ
管他重複不重複(O
讓我回家再想想
如果大老幫我想出方法
還請不吝告訴小的🙏
Arch

給的東西用不起來
[sticker](media:AAQFABNnrt8yAARQm2r4xP2B9-xbAAIC@telegram)
libssl.so.10
是什麼版本
我只有 libssl.1.0.0