Bash
如何將添加 x 天轉換為 bash 中的 var
我有一個包含許多行的文件,如下所示:
0 D FakeSip 192.169.192.192 jan/26/2022 17:10:31
我想導出 IP 地址,日期然後在日期上加上 10 天,這將給我到期日期。我有 ip,插入的日期沒問題,但是在日期加上 10 天並導出證明很痛苦。會感激一些幫助嗎?
cat FakeSip.txt|awk --posix '$4 ~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ { print " IP Address "$4 " Date Identified "$5 " Expiration " (date -d $5+10 days);}'
這是上面給出的輸出
IP Address 192.241.212.118 Date Identified jan/25/2022 Expiration 010
所需的輸出如下所示:
IP Address 192.169.192.192 Date Identified jan/26/2022 Expiration Feb/05/2022
LANG=C LC_ALL=C awk ' $4 ~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ { dvar = $5; gsub("[^[:digit:][:alpha:]]+"," ",dvar); # turn any special character into space to make date parseable and protect against command injection cmd = "date -d \"" d"+10 days\" +%b/%d/%Y"; cmd | getline expire; close(cmd); print " IP Address "$4 " Date Identified "$5 " Expiration " expire } ' FakeSip.txt
由於這個答案的功勞,我從中抄寫了將命令輸出分配給變數的程式碼:
與
zsh
:#! /bin/zsh - zmodload zsh/datetime read -r x y z ip date time < FakeSip.txt && LC_ALL=C strftime -rs t '%b/%d/%Y %H:%M:%S' "$date $time" && LC_ALL=C strftime -s expire %b/%d/%Y $((t+10*24*60*60)) && print -r IP Address $ip Date Identified $date Expiration $expire
這
LC_ALL=C
是強制將這些月份縮寫以英文解釋/輸出。刪除它,以便以使用者的語言解釋/輸出它們。日期以本地時間解釋,我們添加 864000 秒。這並不總是與 10 天相同,具體取決於您如何定義一天以及涉及 DST 的位置。
替換
$expire
為${(L)expire}
(或$expire:l
類似 intcsh
)以將月份名稱轉換為L
大寫(feb
而不是Feb
匹配 that 的樣式jan
)。