Bash

如何將添加 x 天轉換為 bash 中的 var

  • January 27, 2022

我有一個包含許多行的文件,如下所示:

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類似 in tcsh)以將月份名稱轉換為L大寫(feb而不是Feb匹配 that 的樣式jan)。

引用自:https://unix.stackexchange.com/questions/688019