如何计算一个单词从另一个单词开始的实例数

如何计算一个单词从另一个单词开始的实例数

我需要grep从今天开始的 MySQL 错误日志,格式如下:

`date +"%y%m%d"` (140710) 

并查找该单词的所有实例partitioned

我尝试了各种方法都无济于事。这似乎有效:

more +/"`date +"%y%m%d"`" mysql-error.log | grep -c partitioned

但是,如果日志文件不包含今天的任何条目,则它不会返回零,而是搜索整个文件并返回整个文件的数字。

如果今天没有条目,而不是grep整个文件,我需要它返回零并计算结果。

有没有更好的方法来做到这一点,使用sedawk什么?


从技术上讲,我认为我需要计算的} partitioned {后面是一串字母数字字符,}),因为可能会出现分段的 {(没有任何字符串)} 并且不应该被计算在内。

但这并不是一个严格的要求。我很高兴只计算这个词的出现次数partitioned

以下是日志文件的示例:

140109 12:25:07 [Note] WSREP: view(view_id(PRIM,c4819ddf-7952-11e3-89fc-4f9f1bfa267f,3) memb {
    c4819ddf-7952-11e3-89fc-4f9f1bfa267f,
} joined {
} left {
} partitioned {
    f85c2e70-7952-11e3-a759-aa8332246e85,
})
140109 12:25:07 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 85)

答案1

使用GNU sedanhd grep,您可以尝试:

sed -n "/$(date +%y%m%d)/,\$p" file | grep -c partitioned

/pattern/,$将第一个模式匹配到文件末尾。

根据您的输入:

$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
1

没有匹配日期:

$ sed -n "/$(date +%y%m%d)/,\$p" 1.txt | grep -c partitioned
0

答案2

您可以尝试将两个 grep 链接在一起:

grep `date +"%y%m%d"` mysql-error.log | grep -c partitioned

或者更简单:

grep -c "`date +%y%m%d`.*partitioned" mysql-error.log

编辑

由于日期和“已分区”一词位于不同行,因此:

d=$(date +"%y%m%d"); awk '/'$d'/,EOF {print $0}' mysql-error.log | grep -c partitioned

或者:

awk '/'$(date +%y%m%d)'/,EOF {print $0}' mysql-error.log | grep -c partitioned

相关内容