私はCentOSで実行されるbashスクリプトを書いています。このスクリプトは、最初にアプリケーションセッションが開始して終了する行を取得し、1時間以上続くと出力します。
ログファイルのタイムスタンプ形式は2017-01-03T00:00:15.529596-03:00です。
$ iはアプリケーションセッションIDです。
これが私が今まで持っているものです:
for i in $( grep 'session-enter\|session-exit' logfile | awk '{ print $5}' ); do
echo ""
echo "***** $i *****"
grep 'session-enter\|session-exit' logfile | grep $i
start=$(grep session-enter logfile | grep $i | awk '{ print $1 }' | sed 's/-03:00//g')
end=$(grep session-exit logfile | grep $i | awk '{ print $1 }' | sed 's/-03:00//g')
epochStart=$(date -d "$start" +%s )
epochEnd=$(date -d "$end" +%s )
duration=$( date -u -d "0 $epochEnd seconds - $epochStart seconds" +"%H:%M:%S" )
if [ "$epochStart"="" ] || [ "$epochEnd"="" ]
then
echo Duration: $duration
else
continue
fi
done
これにご協力いただきありがとうございます。
答え1
エポック以降の開始時刻と終了時刻を秒単位で保存したようです。これが本当なら、次のことができるはずです。
duration=$(( $epochEnd - $epochStart ))
[ $duration -gt 3600 ] && echo "Duration: $duration"
答え2
私は入力データについて次の仮定に基づいてこのコードを書いています。
入力ファイルをスクリプトに引数として渡す
入力ファイル
$ cat input
2017-01-03T00:00:15.529596-03:00 session-enter TEST1
......
.......
......
2017-01-03T00:00:37.529596-03:00 session-exit TEST1
.....
.....
2017-01-03T00:00:18.529596-03:00 session-enter TEST2
......
.......
......
2017-01-03T00:03:20.529596-03:00 session-exit TEST2
...........
..........
2017-01-03T00:00:18.529596-03:00 session-enter TEST3
......
.......
......
2017-01-03T02:03:20.529596-03:00 session-exit TEST3
extract.sh
#!/bin/bash
SESSION_LOG_FILE=${1}
SESSION_EXTRACT_FILE=/tmp/$$.txt
awk '/enter/{sname=$NF;start=$1;}/exit/ && $0~sname{end=$1;}start && end{print sname,start,end;start="";end="";}' "${SESSION_LOG_FILE}" > ${SESSION_EXTRACT_FILE}
while read SESSION_NAME SESSION_START SESSION_END
do
echo "---------${SESSION_NAME}---------"
echo "Start Time : ${SESSION_START}"
echo "End Time : ${SESSION_END}"
START_EPOCH=${SESSION_START%-*}
START_EPOCH=$(date -d "${START_EPOCH}" +%s)
END_EPOCH=${SESSION_END%-*}
END_EPOCH=$(date -d "${END_EPOCH}" +%s)
DIFFERENCE=$((${END_EPOCH}-${START_EPOCH}))
echo "DIFFERENCE in seconds : ${DIFFERENCE}"
done < "${SESSION_EXTRACT_FILE}"
出力
$ ./extract.sh input
---------TEST1---------
Start Time : 2017-01-03T00:00:15.529596-03:00
End Time : 2017-01-03T00:00:37.529596-03:00
DIFFERENCE in seconds : 22
---------TEST2---------
Start Time : 2017-01-03T00:00:18.529596-03:00
End Time : 2017-01-03T00:03:20.529596-03:00
DIFFERENCE in seconds : 182
---------TEST3---------
Start Time : 2017-01-03T00:00:18.529596-03:00
End Time : 2017-01-03T02:03:20.529596-03:00
DIFFERENCE in seconds : 7382
タイム秒が3600より大きいことを確認してください。
#!/bin/bash
SESSION_LOG_FILE=${1}
SESSION_EXTRACT_FILE=/tmp/$$.txt
awk '/enter/{sname=$NF;start=$1;}/exit/ && $0~sname{end=$1;}start && end{print sname,start,end;start="";end="";}' "${SESSION_LOG_FILE}" > ${SESSION_EXTRACT_FILE}
while read SESSION_NAME SESSION_START SESSION_END
do
START_EPOCH=${SESSION_START%-*}
START_EPOCH=$(date -d "${START_EPOCH}" +%s)
END_EPOCH=${SESSION_END%-*}
END_EPOCH=$(date -d "${END_EPOCH}" +%s)
DIFFERENCE=$((${END_EPOCH}-${START_EPOCH}))
if [ "${DIFFERENCE}" -gt "3600" ]
then
echo "---------${SESSION_NAME}---------"
echo "Start Time : ${SESSION_START}"
echo "End Time : ${SESSION_END}"
echo "DIFFERENCE in seconds : ${DIFFERENCE}"
fi
done < "${SESSION_EXTRACT_FILE}"