我想提取兩個不同的相對時間戳之間的行,我寫了一個 bash 腳本,但它不能正常作業;請讓我知道如何正確地做到這一點。
我的日志檔案如下所示:
22/06/23 19:30:21 [Logs...]
22/06/24 17:58:30 [Logs...]
22/06/24 17:59:48 [Logs...]
22/06/24 18:11:27 [Logs...]
22/06/24 18:11:28 [Logs...]
無法正常作業的代碼:
命令: ./test.sh -t 22/06/24,17:58:00-22/06/24,18:11:59
代碼:
#! /bin/bash
#INPUT: 22/06/24,17:58:00-22/06/24,18:11:30
#startDate=22/06/24
startDate=$(echo $2 | cut -d "-" -f 1 | cut -d "," -f 1)
#endDate=22/06/24
endDate=$(echo $2 | cut -d "-" -f 2 | cut -d "," -f 1)
#startTime=17:58:00
startTime=$(echo $2 | cut -d "-" -f 1 | cut -d "," -f 2)
#endTime=18:11:30
endTime=$(echo $2 | cut -d "-" -f 2 | cut -d "," -f 2)
#Script Parameter Format to search in Log Files: YY/MM/DD hh:mm:ss-YY/MM/DD hh:mm:ss
#timestampStart=22-06-24 17:58:00
timestampStart=$(echo $startDate | cut -d "/" -f 1)-$(echo $startDate | cut -d "/" -f 2)-$(echo $startDate | cut -d "/" -f 3)" "$startTime
#timestampEnd=22-06-24 18:11:27
timestampEnd=$(echo $endDate | cut -d "/" -f 1)-$(echo $endDate | cut -d "/" -f 2)-$(echo $endDate | cut -d "/" -f 3)" "$endTime
#tstart=1656077280
tStart=`date --date="$timestampStart" %s`
#tEnd=1656078090
tEnd=`date --date="$timestampEnd" %s`
while read -r line; do
re="[0-9]{2}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}"
if [[ $line =~ $re ]]; then
#searchDate="22/06/24 17:58:00"
searchDate=$(echo $line | cut -d " " -f 1,2)
#searchTime="22-06-24 17:58:00"
searchTime=$(echo $searchDate | cut -d "/" -f 1)-$(echo $searchDate | cut -d "/" -f 2)-$(echo $searchDate | cut -d "/" -f 3)
#tSearch=1656077280
tSearch=`date --date="$searchTime" %s`
fi
#if 1656077280>=1656077280 AND 1656077280<=1656078090
if [ $tSearch -gt $tStart ] && [ $tSearch -lt $tEnd ];then
#22/06/24 17:58:00 at java.lang.Integer.parseInt(Integer.java:542)
echo $line
fi
done < /oracleAS10g/product/opmn/logs/OC4J~officeauto~default_island~1
輸出錯誤:
./test.sh: line 43: [: -gt: unary operator expected
預期輸出:顯示指定的兩個時間戳之間的行
22/06/24 17:58:30 [Logs...]
22/06/24 17:59:48 [Logs...]
22/06/24 18:11:27 [Logs...]
uj5u.com熱心網友回復:
Usingsed對于精確的模式匹配很有用,但對于比較“大于”或“小于”的值,您可能會發現它更容易使用grepor awk。例如,給定輸入(日期和時間之間的空格,將時間戳與日志條目分開的制表符):
$ cat foo.txt
22/06/23 19:30:21 [Logs ... 5]
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
22/06/24 18:11:27 [Logs ... 2]
22/06/24 18:11:28 [Logs ... 1]
您可以sed按照其他答案所示使用(我將awk通過比較擴展):
$ sed -n '\#22/06/24 17:58:30#, \#22/06/24 18:11:27#p' foo.txt
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
22/06/24 18:11:27 [Logs ... 2]
基本上是:
$ sed -n '/pattern1/, /pattern2/p' file.txt
請注意需要將 更改為/pattern1/, /pattern2/允許/在搜索模式中使用斜杠 ( ) 的棘手部分。選擇最適合您的資料的一個。我在#這里使用。
使用awk大致相同,除了允許/在搜索模式中有所不同;所以,
$ awk -F'\t' '/pattern1/, /pattern2/' file.txt
變成,為了/在模式中允許:
$ awk -F'\t' '$0~v1, $0~v2' v1="pattern1" v2="pattern2" file.txt
但這只是匹配兩個模式之間的行,并且模式必須完全匹配。我們可以將時間戳視為字母數字模式,并將“大于”pattern1 的行匹配到“小于”的行pattern2:
$ awk -F'\t' '$1>=v1 && $1<=v2' v1="22/06/24 17:58:30" v2="22/06/24 18:11:27" foo.txt
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
22/06/24 18:11:27 [Logs ... 2]
但這是一個字母數字比較,因此您可以使用其他日期,例如搜索模式:
$ awk -F'\t' '$1>=v1 && $1<=v2' v1="22/06/24 00:00:00" v2="22/06/24 18:00:00" foo.txt
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
您可以將>=and切換為<=簡單的>,<具體取決于您是否要包含給定的日期。
uj5u.com熱心網友回復:
看起來像一個簡單awk的可以在這里完成作業:
awk -v d1="22/06/24 17:58:30" -v d2="22/06/24 18:11:30" '
($1 " " $2) >= d1 && ($1 " " $2) <= d2' file
22/06/24 17:58:30 [Logs...]
22/06/24 17:59:48 [Logs...]
22/06/24 18:11:27 [Logs...]
22/06/24 18:11:28 [Logs...]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496501.html
