다음과 같은 줄이 많은 파일이 있습니다.
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:l
tcsh
L
feb
Feb
jan
답변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::Strptime
CPAN의 모듈.
이로 인해
$ 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