我有一个日志文件,日志中的每一行都带有一个日期,如下所示:
2012-03-06 11:34:48,657 blah blah blah...
我如何创建grep这个文件并只获取从早上 8 点到晚上 11 点的行?
我的意图是我想计算上午 8 点到晚上 11 点之间发生的错误数量。
use*_*686 26
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'
Run Code Online (Sandbox Code Playgroud)
详细解释可以在各种regex(正则表达式)教程中找到;egrep使用“POSIX 扩展”语法 ( man 7 regex)。
第一个^意思是“行的开始”。
[^ ]+ 只匹配日期字段,而不管实际日期。
[...]表示“括号之间的任何字符”,因此[89]将匹配8或9; [0-9]是任何数字,并且[^ ]是除空格之外的任何数字(因为有^括号)。
+指“一个或多个先前的”(例如,a+将匹配a,aaa和aaaaaaaa)。
所以^[^ ]+将从行的开头开始,并尽可能多地匹配非空格字符。
(...|...|...)表示“给定模式中的任一个”,因此(0[89]|1[0-9]|2[012])表示“要么0[89]或1[0-9]要么2[012]”。它将匹配从 08 到 22 的所有数字。
一个更好的选择是:
awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'
Run Code Online (Sandbox Code Playgroud)
该-F选项根据[: ]正则表达式(匹配任一:或空格)将每一行拆分为单独的字段,并且awk脚本检查第二列(小时)。
Nim*_*a G 23
为什么要费心使用grep?您可以简单地使用 sed。
例子:
sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log
Run Code Online (Sandbox Code Playgroud)
这将打印June 17 13:39:54和之间的所有日志June 18 10:50:28