【问题标题】:Count the number of occurences in a file in the last 7 days [duplicate]计算过去 7 天文件中出现的次数[重复]
【发布时间】:2021-02-08 12:51:54
【问题描述】:

输入:

cat log.txt

2021-01-15 00:00:14: Installing hotfix ...
2021-01-15 00:02:07: Hotfix successfully installed!
2021-01-15 00:02:07: Finished
2021-02-07 00:00:14: Installing hotfix ...
2021-02-07 00:02:07: Hotfix successfully installed!
2021-02-07 00:02:07: Finished
2021-02-08 12:00:14: Started - Looking for available hotfixes ...
2021-02-08 12:00:14: Updating the hotfix list
2021-02-08 12:00:14: Finished

我想创建一个每日 cronjob,用单词 installed 的出现次数更新 file.txt,但仅限于过去 7 天。因此,每当我阅读 file.txt 时,它应该包含过去 7 天内安装的修补程序的数量。

当前日期:2021-02-08

输出:

cat file.txt
1

我知道我可以使用grep -c "installed" log.txt 来计算日志文件中的所有事件。但是如何修改它以便 grep 只计算过去 7 天的出现次数?日期总是会改变,因为每天都会添加新行,所以我无法在 grep 脚本中提供固定日期。此外,在某一天可能会出现多个 installed,因此我无法按行号进行 grep。

【问题讨论】:

  • 您能否发布更清晰的输入和预期输出示例,以便更好地理解您的问题。

标签: linux bash shell grep


【解决方案1】:
awk -v d="$(date -d "7 days ago" "+%F")" '$1 > d && /installed/{c++}END{print c}' log.txt >file.txt

【讨论】:

  • 对不起,我对 awk 很不好。如果file.txt是输出文件,如何指定输入文件log.txt?我需要在 awk 之前cat 吗?
【解决方案2】:

使用来自 GNU coreutils 的 date 和普通的 bash

#!/bin/bash

linecount=0
weekago=$(date -d "-7 days" +%F)
while read -r line; do
        [[ $line > $weekago ]] && [[ $line = *installed* ]] && ((++linecount))
done < log.txt
echo $linecount > file.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多