Grep 文件中的日期并格式化它们
Grep dates from file and format them
我有一个文件“tmp.txt”看起来像这样:
random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
我想:
- 提取所有日期时间
- 增加 4 小时
- 将它们显示为时间戳
我还不知道如何添加小时,因为我遇到了日期函数无法识别日期格式的问题。
(如果可能的话,我希望能够用一行命令来完成)
这是我当前的命令:
egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt | while read -r line ; do echo $(date -d "$line" +%s);done
感谢帮助!
让我调整时间戳以使输出更有趣:
$ cat tmp.txt
random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 20:15:15
random text random text 26/06/2021 23:15:15
@jhnc 的想法是正确的:使用一种既擅长文本操作又能进行日期算术的语言。我会使用 Time::Piece
perl -MTime::Piece -lne '
m{(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d)} or continue;
$t = Time::Piece->strptime(, "%d/%m/%Y %T");
$t += 4 * 3600;
print $t->strftime("%F %T")
' tmp.txt
2021-06-25 19:15:15
2021-06-27 00:15:15
2021-06-27 03:15:15
或者,这里是 perl 管道到 xargs 的日期内容
perl -pe 's{.*(\d{2})/(\d{2})/(\d{4}) (\d{2}:\d{2}:\d{2}).*}
{// +4 hours }
' tmp.txt | xargs -I DT date -d DT '+%F %T'
2021-06-25 19:15:15
2021-06-27 00:15:15
2021-06-27 03:15:15
久经考验的最小解决方案
您可以使用以下命令行来获得所需的结果。我已经用您的示例对其进行了测试,它在我的 Linux 机器上按预期工作。
egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt | while read -r line; do dd=${line:0:2}; mm=${line:3:2}; yyyy=${line:6:4}; time=${line:11:8}; date -d "${yyyy}-${mm}-${dd} ${time} 4 hours" +'%Y-%m-%d %H:%M:%S'; done
我将其分成多行以便于理解:
egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt \
| \
while read -r line; do
# Reading date and time into separate variables
dd=${line:0:2};
mm=${line:3:2};
yyyy=${line:6:4};
time=${line:11:8};
# Adding 4 hours and displaying datetime in desired format
date -d "${yyyy}-${mm}-${dd} ${time} 4 hours" +'%Y-%m-%d %H:%M:%S';
done
要增加 4 小时,您可以在 -d 选项中的日期时间之后提及它,如上所示,我尝试了小时、分钟和天,它按预期工作
对于您的输入文件 tmp.txt:
random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
在 运行 我的命令上,输出是:
2021-06-25 19:15:15
2021-06-26 19:15:15
2021-06-26 19:15:15
我用接近午夜时间、闰年等极端情况对其进行了测试,它运行良好
我有一个文件“tmp.txt”看起来像这样:
random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
我想:
- 提取所有日期时间
- 增加 4 小时
- 将它们显示为时间戳
我还不知道如何添加小时,因为我遇到了日期函数无法识别日期格式的问题。
(如果可能的话,我希望能够用一行命令来完成)
这是我当前的命令:
egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt | while read -r line ; do echo $(date -d "$line" +%s);done
感谢帮助!
让我调整时间戳以使输出更有趣:
$ cat tmp.txt
random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 20:15:15
random text random text 26/06/2021 23:15:15
@jhnc 的想法是正确的:使用一种既擅长文本操作又能进行日期算术的语言。我会使用 Time::Piece
perl -MTime::Piece -lne '
m{(\d\d/\d\d/\d\d\d\d \d\d:\d\d:\d\d)} or continue;
$t = Time::Piece->strptime(, "%d/%m/%Y %T");
$t += 4 * 3600;
print $t->strftime("%F %T")
' tmp.txt
2021-06-25 19:15:15
2021-06-27 00:15:15
2021-06-27 03:15:15
或者,这里是 perl 管道到 xargs 的日期内容
perl -pe 's{.*(\d{2})/(\d{2})/(\d{4}) (\d{2}:\d{2}:\d{2}).*}
{// +4 hours }
' tmp.txt | xargs -I DT date -d DT '+%F %T'
2021-06-25 19:15:15
2021-06-27 00:15:15
2021-06-27 03:15:15
久经考验的最小解决方案
您可以使用以下命令行来获得所需的结果。我已经用您的示例对其进行了测试,它在我的 Linux 机器上按预期工作。
egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt | while read -r line; do dd=${line:0:2}; mm=${line:3:2}; yyyy=${line:6:4}; time=${line:11:8}; date -d "${yyyy}-${mm}-${dd} ${time} 4 hours" +'%Y-%m-%d %H:%M:%S'; done
我将其分成多行以便于理解:
egrep -o "[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}" tmp.txt \
| \
while read -r line; do
# Reading date and time into separate variables
dd=${line:0:2};
mm=${line:3:2};
yyyy=${line:6:4};
time=${line:11:8};
# Adding 4 hours and displaying datetime in desired format
date -d "${yyyy}-${mm}-${dd} ${time} 4 hours" +'%Y-%m-%d %H:%M:%S';
done
要增加 4 小时,您可以在 -d 选项中的日期时间之后提及它,如上所示,我尝试了小时、分钟和天,它按预期工作
对于您的输入文件 tmp.txt:
random text random text 25/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
random text random text 26/06/2021 15:15:15
在 运行 我的命令上,输出是:
2021-06-25 19:15:15
2021-06-26 19:15:15
2021-06-26 19:15:15
我用接近午夜时间、闰年等极端情况对其进行了测试,它运行良好