다음 로그가 있습니다.
30-12-2022 23:24:32 : URI: p=2&pwr=0&noipcheck
30-12-2022 23:28:43 : URI: p=2&pwr=1110&noipcheck&debug
30-12-2022 23:28:51 : URI: p=2&pwr=0&noipcheck&debug
30-12-2022 23:31:57 : URI: p=2&pwr=2.200000
30-12-2022 23:50:02 : URI: p=2&pwr=0
31-12-2022 06:59:35 : URI: p=2&pwr=3
31-12-2022 07:04:35 : URI: p=2&pwr=0
31-12-2022 10:39:31 : URI: p=2&pwr=2.900000
31-12-2022 10:53:31 : URI: p=2&pwr=1507.900000
31-12-2022 10:53:36 : URI: p=2&pwr=1326.400000
31-12-2022 10:53:41 : URI: p=2&pwr=1410.200000
31-12-2022 10:53:46 : URI: p=2&pwr=2.900000
이제 어떻게 스크립트를 작성할 수 있나요?
simulate <hostname> <mydate> <starttimestamp> <endtimestamp> <logfilename>
여기서 날짜는 필터링 <mydate>
<starttimestamp>
<endtimestamp>
되고 URI는 를 사용하여 호출되어야 합니다 <hostname>
.
sleep
두 번째 줄을 미리 읽어야 시차를 알 수 있어서 만드는데 애를 먹고 있어요 .
철 simulate https://www.xxxx.at 31-12-2022 10:00:00 10:55:00 log.txt
유닉스 환경의 bash에서 이 작업을 수행하는 방법은 무엇입니까?
그런 다음 호출해야 하지만 로그 시간에 따라 각 호출 사이의 https://www.xxxx.at?<URI>
가장 최근 시간 이후에 시간 지연이 있습니다 .<starttimestamp>
철:
now:
`curl` "https://www.xxxx.at?p=2&pwr=2.900000"
`sleep` timedifference [31-12-2022 10:53:31 - 31-12-2022 10:39:31]
`curl` "https://www.xxxx.at?p=2&pwr=1507.900000"
...
`sleep` timedifference [31-12-2022 10:53:46 - 31-12-2022 10:53:41]
`curl` "https://www.xxxx.at?p=2&pwr=2.900000"
답변1
이제 awk 스크립트[named ] mysim.awk
에서 이 작업을 수행 할 수 있습니다.
BEGIN { FS="- :" }
{
split($1,a,"[: -]")
secs = mktime(a[3]" "a[2]" "a[1]" "a[4]" "a[5]" "a[6])
cmd[NR] = a[11]
t[NR] = a[6] + 60 * (a[5] + 60 * a[4])
dt[NR] =a[3]" "a[2]" "a[1]" "a[4]" "a[5]" "a[6]
}
END {
split(sdt,b,"[-: ]")
split(edt,bb,"[-: ]")
startsecs = mktime(b[3]" "b[2]" "b[1]" "b[4]" "b[5]" "b[6])
endsecs = mktime(bb[3]" "bb[2]" "bb[1]" "bb[4]" "bb[5]" "bb[6])
print sdt"[->"startsecs"] bis "edt"[->"endsecs"]"
for (c = 1; c <= NR-1; c++)
{
if ((mktime(dt[c]) >= startsecs) && (mktime(dt[c]) <= endsecs))
{
d = t[c+1] - t[c]
if (d < 0) d += 86400
h = d / 3600
d %= 3600
m = d / 60
s = d % 60
printf "sleep %02d ; %s%s \n",s,"curl \"https://xxxxx.at/sendsms.php?noresponse&noipcheck&nosms&debug&",cmd[c]"\""
}
}
}
LINUX 프롬프트에서 startdatetime 및 enddatetime fe를 호출합니다.
awk -v sdt="31-12-2022 11:00:00" -v edt="31-12-2022 13:00:00" -f mysim.awk mylog.txt
또는 다음과 같이 bash 스크립트(이름이 runsimulate.sh
])를 통해:
#!/bin/bash
# call f.e. ./runsimulate.sh "02-01-2023 14:00:00" "02-01-2023 14:50:00" <logfilename>
awk -f mysim.awk -v sdt="$1" -v edt="$2" $3