bash에서 x 일 추가를 var로 변환하는 방법

bash에서 x 일 추가를 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

답변1

  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

신용 때문에이 답변, 명령 출력을 변수에 할당하기 위한 코드를 복사했습니다.

답변2

그리고 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일이 되는 것은 아닙니다.하늘그리고 일광 절약 시간이 관련된 경우.

$expire소문자로 변환할 월 이름을 해당 스타일과 일치하는 대신 ${(L)expire}(또는 이와 유사한)로 바꿉니다 .$expire:ltcshLfebFebjan

답변3

파티에 늦었지만 데이트 질문을 좋아해요.

펄을 사용하여

use strict;
use warnings;
use Time::Piece;

# regex stolen from Regexp::Common::net
# https://metacpan.org/pod/Regexp::Common::net

my $re_ipv4 = qr/(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))/o;
my $fmt = '%b/%d/%Y';

while (<>) {
    my @F = split ' ';
    if ($F[3] =~ /^$re_ipv4$/) {
        my $dt = Time::Piece->strptime($F[4], $fmt);
        my $exp = ($dt + 86400 * 10)->strftime($fmt);
        print "IP Address $F[3] Date Identified $F[4] Expiration " . lc($exp) . "\n";
    }
}

나는 일을 표시하기 위해 초를 추가하는 것을 별로 좋아하지 않지만 이 코드는 시간대를 지원하지 않으므로 일광 절약 시간제 변환이 작동하지 않습니다. 이를 "올바르게" 수행하려면 다음이 필요합니다.DateTime그리고DateTime::Format::StrptimeCPAN의 모듈.

이로 인해

$ perl add10.pl file
IP Address 192.169.192.192 Date Identified jan/26/2022 Expiration feb/05/2022

아니면 루비,

require 'date'

re_ipv4 = Regexp.new("^(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))$")
fmt = '%b/%d/%Y'

File.new(ARGV.shift).each do |line|
  fields = line.split
  if fields[3].match?(re_ipv4)
    dt = Date.strptime(fields[4], fmt)
    exp = (dt + 10).strftime(fmt).downcase
    puts "IP Address #{fields[3]} Date Identified #{fields[4]} Expiration #{exp}"
  end
end

그리고

$ ruby add10.rb file
IP Address 192.169.192.192 Date Identified jan/26/2022 Expiration feb/05/2022

관련 정보