我想在这里做的是,我每天都会附加日志文件。我想从文件中删除超过 6 个月的日志条目。我可以删除 6 个月的条目,但超过 6 个月的条目怎么办,我找不到解决方案。有人可以让我了解这个逻辑并给出一些提示吗?
#!/bin/bash
pattern=$(date -d "6 month ago" +%Y%m%d)
sed "/$pattern/d" /root/new/Logfile.log >> outputfile
我在这里要做的是,它还应该检查超过 6 个月Logfile.log
条目,其中第 4 列包含日期。
示例日志文件.log模式如下所示:
ERROR 8245001 000 20141215 171010 Patch output error in output
ERROR 8245001 000 20141215 171010 Patch output error in output
ERROR 8245001 000 20150515 171010 Patch output error in output
ERROR 8245001 000 20150515 171010 Patch output error in output
ERROR 8245001 000 20161215 171011 Patch output error in output
ERROR 8245001 000 20161215 171011 Patch output error in output
ERROR 8245001 000 20161215 171011 Patch output error in output
ERROR 8245001 000 20161215 171011 Patch output error in output
ERROR 8245001 000 20171215 171012 Patch output error in output
ERROR 8245001 000 20171215 171012 Patch output error in output
ERROR 8245001 000 20171215 171012 Patch output error in output
ERROR 8245001 000 20180515 171012 Patch output error in output
ERROR 8245001 000 20180515 171119 Patch output error in output
ERROR 8245001 000 20180515 171119 Patch output error in output
请注意,您的问题和此答案都不bash
具体。您正在询问策略,而示例代码的实质是sed
。
您可能希望使用比sed
更灵活的东西。我会使用awk
.而且你很不走运,因为你使用理智的日期格式允许基本的数字或字符串比较来确定顺序! 因此,使用您的示例输入:
$ awk -v d="20180101" '$4>=d' file
ERROR 8245001 000 20180515 171012 Patch output error in output
ERROR 8245001 000 20180515 171119 Patch output error in output
ERROR 8245001 000 20180515 171119 Patch output error in output
或者,如果您愿意:
$ awk -v d="20180101" '$4>=d' c > c,$$ && mv c,$$ c
awk
/gawk
在线用户:
gawk -v dt="$(date -d "6 month ago" +%Y%m%d)" '$4+0>=dt+0' /root/new/Logfile.log >> outputfile
检查awk 如何在字符串和数字之间转换