gpt4 book ai didi

bash - 在日志文件中使用 awk 将日期转换为 unix 纪元

转载 作者:行者123 更新时间:2023-11-29 09:42:28 32 4
gpt4 key购买 nike

我的文件包含格式为“[dd.mm.yyyy.] 文本值”的多行。我需要将其转换为“Unix 纪元 | 文本值”。我尝试使用 awk 来执行此操作,但似乎找不到正确的命令例如,如果文件是:

[30.08.2013 13:54:49.126] Foo
[30.08.2013 13:56:49.126] Bar
[30.08.2013 13:59:49.126] Foo bar

我使用以下(可能太复杂的 awk 命令):

cat sample.txt |剪切-c 2- |awk -F'[。 :]' ' { $cmd="date --date ""\""$3$2$1""$4":"$5":"$6"\"""+%s"; $cmd |& getline 纪元;关闭($cmd); printf 纪元"|";打印 $0 ;}';

问题是我正确地得到了纪元时间,但我无法访问该行的其余部分。 $0(和其他 $ 变量)包含日期命令。所以输出是

 1377863689|date --date "20130830 13:54:49" +%s
1377863809|date --date "20130830 13:56:49" +%s
1377863989|date --date "20130830 13:59:49" +%s

我想得到的是

 1377863689|Foo
1377863809|Bar
1377863989|Foo bar

有没有一种(最好是简单的)方法来完成这个?我应该使用其他工具吗?

最佳答案

假设您有 gawk(合理的假设,因为您使用的是 GNU date),您可以在内部对 gawk 执行此操作:

$ awk  'match($0, /\[(.*)\] (.*)/, a) && 
match(a[1], /([0-9]{2})\.([0-9]{2})\.([0-9]{4}) ([0-9:]+)(\.[0-9]+)/,b) {
gsub(/:/," ",b[4])
s=b[3] " " b[2] " " b[1] " " b[4]
print mktime(s) "|" a[2]
}' file
1377896089|Foo
1377896209|Bar
1377896389|Foo bar

或者,一个 Bash 解决方案:

while IFS= read -r line; do 
if [[ "$line" =~ \[([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{4})\ +([[:digit:]:]+)\.([[:digit:]]+)\]\ +(.*) ]]
then
printf "%s|%s\n" $(gdate +"%s" --date="${BASH_REMATCH[3]}${BASH_REMATCH[2]}${BASH_REMATCH[1]} ${BASH_REMATCH[4]}") "${BASH_REMATCH[6]}"
fi
done <file

关于bash - 在日志文件中使用 awk 将日期转换为 unix 纪元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42447069/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com