我需要grep
从今天开始的 MySQL 错误日志,格式如下:
`date +"%y%m%d"` (140710)
并查找该单词的所有实例partitioned
。
我尝试了各种方法都无济于事。这似乎有效:
more +/"`date +"%y%m%d"`" mysql-error.log | grep -c partitioned
但是,如果日志文件不包含今天的任何条目,则它不会返回零,而是搜索整个文件并返回整个文件的数字。
如果今天没有条目,而不是grep
整个文件,我需要它返回零并计算结果。
有没有更好的方法来做到这一点,使用sed
或awk
什么?
从技术上讲,我认为我需要计算的} 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 sed
anhd 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