我需要從如下格式的日志檔案中獲取開始時間和結束時間:
REQUEST test 1 1651474077633
.
.
.
.
REQUEST test n 1651474676561
我想列印開始和結束時間。時間是 Unix 格式,我想把它轉換成標準的日期和時間格式。
我試過的代碼:
cat ${FILENAME} | awk 'BEGIN {
print strftime("Time = %m/%d/%Y %H:%M:%S", NF)
}'
但它一直列印。
我只想要第一次進入和最后一次進入的時間。
uj5u.com熱心網友回復:
它們確實是有效的 POSIX 紀元時間戳,以毫秒為單位。
只需將該值除以 1000,您就會得到一個標準時間戳 - 2022 年 5 月 3 日:
echo "${ccccc}" |
gawk -be '
function printtime(_,__,___,____) {
print \
substr((____=RS)(RS="\n"),
(__=sprintf("gdate \47%5s Time = "(___\
)"\47",__,_*1e-3)) | getline _,
RS*close(__)^(RS=____))_
} 1<NF {
__[ _]=$!(NF=NF)
} END {
printtime(__[_^!_], "First", ___)
printtime(__[( _)], "Last", ___)
}' ___='%D %T.%6N' FS='^REQUEST[^t] test[ ] ([n]|[0-9] )[ ] ' | ecp
First Time = 05/03/22 00:55:57.458000
Last Time = 05/03/22 00:55:57.462939
uj5u.com熱心網友回復:
我認為您的代碼使用BEGIN
不NF
正確。
試試下面的代碼。
awk '$1 == "REQUEST" { print strftime("Time = %m/%d/%Y %H:%M:%S", $4) }' "$FILENAME"
如果您只想輸出第一個和最后一個輸出:
awk '
BEGIN { first = 1 }
$1 == "REQUEST" {
if (first) {
firsttime = $4
first = 0
}
lasttime = $4
}
END {
print strftime("First Time = %m/%d/%Y %H:%M:%S", firsttime)
print strftime("Last Time = %m/%d/%Y %H:%M:%S", lasttime)
}' "$FILENAME"
有問題的文本中的數字似乎不是 UNIX 時間,但您可以在那里查看。
uj5u.com熱心網友回復:
檢查您的時間戳,例如https://www.epochconverter.com/它們似乎確實以毫秒為單位。
如果您的檔案結構始終作為示例檔案,您可以獲取$NF
用于第一行和最后一行的最后一個欄位的值,并在END
塊中列印結果。
如果有單行匹配,則沒有結束時間。如果沒有匹配的行,您可以列印自定義訊息。
請注意,您不必使用cat
awk '
!start && $1 == "REQUEST"{
start = $NF
next
}
$1 == "REQUEST" {
last = $NF
}
END {
if (start) {
print strftime("Start time = %m/%d/%Y %H:%M:%S", start/1000)
}
if (last) {
print strftime("End time = %m/%d/%Y %H:%M:%S", last/1000)
}
if (!start){
print "No times available."
}
}
' "$FILENAME"
輸出
Start time = 05/02/2022 08:47:57
End time = 05/02/2022 08:57:56
uj5u.com熱心網友回復:
建議date -d @....
與 with組合awk
提取數字。
第一次約會:
date -d @$(awk "{print int(\$4/1000)}" <<< $(head -1 input.txt))
Mon, May 2, 2022 9:47:57 AM
最后日期:
date -d @$(awk "{print int(\$4/1000)}" <<< $(tail -1 input.txt))
Mon, May 2, 2022 9:57:56 AM
以秒為單位的時差:
echo "secs diff = "$(( $(awk "{print int(\$4/1000)}" <<< $(tail -1 input.txt)) - $(awk "{print int(\$4/1000)}" <<< $(head -1 input.txt)) ))
secs diff = 599
uj5u.com熱心網友回復:
請在下面找到我對最初問題的處理方法:
可能的解決方案
$ (head -1 requests.log; tail -1 requests.log) |
tr -s ' ' |
cut -d ' ' -f4 |
awk '{printf( "%.3f\n", $1/1000);}' |
xargs -I T date --date=@T
Mon, May 2, 2022 9:47:57 AM
Mon, May 2, 2022 9:57:56 AM
解釋
$ cat requests.log
REQUEST test 1 1651474077633
REQUEST test 0 1651474077630
REQUEST test 1 1651474077631
REQUEST test 2 1651474077632
REQUEST test 3 1651474077633
REQUEST test 4 1651474676561
第 1 步 - 獲取第一行和最后一行
$ (head -1 requests.log; tail -1 requests.log)
REQUEST test 1 1651474077633
REQUEST test 4 1651474676561
第 2 步 - 修剪多個空白區域
$ (head -1 requests.log; tail -1 requests.log) |
tr -s ' '
REQUEST test 1 1651474077633
REQUEST test 4 1651474676561
第 3 步 - 獲取時間戳
$ (head -1 requests.log; tail -1 requests.log) |
tr -s ' ' |
cut -d ' ' -f4
1651474077633
1651474676561
第 4 步 - 將時間戳轉換為秒
$ (head -1 requests.log; tail -1 requests.log) |
tr -s ' ' |
cut -d ' ' -f4 |
awk '{printf( "%.3f\n", $1/1000);}'
1651474077.633
1651474676.561
第 5 步 - 將時間戳轉換為人類可讀的日期
$ (head -1 requests.log; tail -1 requests.log) |
tr -s ' ' |
cut -d ' ' -f4 |
awk '{printf( "%.3f\n", $1/1000);}' |
xargs -I T date --date=@T
Mon, May 2, 2022 9:47:57 AM
Mon, May 2, 2022 9:57:56 AM
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/470208.html
上一篇:find命令的-exec選項在Ubuntu上無法按預期作業
下一篇:AIXKshgrep腳本問題