需求越來越複雜就要寫 script file
那就找一個好寫一點的 script lang ㄅ
你要處理 log 的機器到底是什麼系統
如果是 ubuntu,真的建議 python 下去…
我這邊只剩 windows + cygwin ………
你有 Windows 但堅持用 bash 處理幹麻…
我還以為是什麼奇怪的環境不允許安裝其他 script lang
awk '/title 2/{print $0; getline; print $0}' test.txt
假設搜行一字串 title 2
search="title 2"; awk -v x="$search" '$0~x {print $0; getline; print $0}' test.txt
改這樣呢?
found=$(search="title 2"; awk -v x="$search" '$0~x {getline nextline; print $0 ", " nextline}' test.txt); echo $found
想說可能是神奇的系統有 awk 沒 sed 之類的
awk 有 NR 可以取得行號
sed 有 sed 'LineNumberq;d' 可以篩出指定行的資料
我想到的是
用 if 抓 OUT 然後再去抓IN
中間丟給 awk 去算
我看不懂你的需求,不過比較時間一般都會轉成 timestamp 對吧?這坨可以取得 Line 1 的前面 datetime 的對應 timestamp
sed '1q;d' time.txt | cut -c 1-19 | while read datetime; do date -d "$datetime" +"%s"; done
或者你可以把 log 建成資料庫再用 sql 去撈(X
我記得不會有兩次IN的紀錄
所以OUT抓到後
直接去找IN
中間就跳過
再重複這樣
這裡用 awk 輸出吧
然後丟到 shell 變數去(?
只是要設定 NR,否則以測資來說,搜 QRA 會導致在線時間爲負
然後我已經照使用者都切開了
所以不會有使用這名稱的問題
我要道歉
getline 是有效的
我變數打錯
難怪出不來
畢竟通常能用更高階的更方便的東西就用
會用到 bash 指令要嘛簡單的小事 要嘛環境不允許
我也很好奇怎麼會第一選擇 awk...
我看很多人都是想著怎麼用 sed + grep 之類的組合搞定
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
好多 var 沒什麼問題啊,這樣還方便修改
不過硬要單行完成就是滿滿的惡意了(X
懶的切換兩個視窗,或者即便都是用終端機也懶的換來換去
有什麼辦法可以做到
抓到 key1 之後去找 key2
最省腦力的方法就是把 key 先 uniq 出來,然後再一個個抓 (X
我現在的會變成
key1
key1
key2
輸出變成
key1 key2
key1 key2
你到時候要給圖的時候
還是直接先用手打幾個範例輸入輸出
感覺比較能抓到你想要哪些動作
所以其實是要抓同名的下一筆 out 之前的最後一筆 in 吧
你 next 應該會比較怕的是中間有插其他 id 的問題吧
那這樣情境似乎更簡單了,用 OUT 當分隔符,然後切開後的第一筆就是 OUT 然後你只要直接抓最後一筆的 IN 就好
date -d "`echo "$line" | awk '{print $1" "$2}'"` (X