尝试根据以下建议打印出特定时间的日志这来自超级用户的帖子。我不确定为什么我的模式没有被 sed 匹配。我粘贴了我正在使用的样本日期和时间这里.如果我使用
sed -n '/2014-03-27 07:00:00/ , /2014-03-27 11:25:00/p' log-file-name
我期望它打印出在 7 am 到 11 am 之间匹配的所有行。但是我得到的匹配结果为零。如果我删除“-n”,它会打印出从 3 am 到 16:14 的所有行。我尝试使用单引号和双引号调整上面的 sed 命令,并尝试了不同的间距选项。但是结果总是“全部或无”。有人能解释一下为什么 sed 没有打印我要求它打印的小时窗口的行吗?
答案1
您正在尝试使用带有开始、停止模式功能的 sed。
因此,如果找到与第一个(开始)模式匹配的行,则将返回输出,直到找到与第二个(停止)模式匹配的行。
如果您的文件中没有明确出现起始行,您将不会得到任何结果。
从选项中删除 -n 标志意味着将打印所有内容,即使它们不匹配您的模式。使用 sed 和 -n '/.../p' 将使其行为类似于 grep。
我发现了一个有用的教程这里
对于您的情况,您可能会考虑类似的模式:
\d{4}-\d{2}-\d{2} ((0[7-9])|(1[0-1])):\d{2}:\d{2},\d{3}
以上将匹配从 07:00 到 11:59 的所有时间,
以下是一些解释:
\d{4} = match 4 digits (year, eg. 2014)
(0[7-9]) = match 07 - 09
| = OR
(1[0-1]) = match 10 -11
答案2
Unix 擅长处理小事情,不要让它们太长。这将从链接的帖子中获取 awk 并添加日期管道。
这将查找行首为 2014-03-27 的所有日期,获取该输出并查找小时数(第二个字段)大于或等于 7 且小于 11 的所有时间。
grep ^2014-03-27 log-file | awk -F'[: ]' '$2 >= 7 && $2 < 11 { print }'
答案3
使用正则表达式会很复杂。也许像这样就可以了:
awk '$1 FS $2>=s{p=1} $1 FS $2>e{exit}p' s="2014-03-27 07:00:00" e="2014-03-27 11:25:00" file
解释:
awk '
$1 FS $2>=s{ # `$1 FS $2` is the string the consists of field 1, a space,
# and field 2. If it is larger or equal (string comparison)
# to the variable s, then:
p=1 # set a variable p to 1
}
$1 FS $2>e{ # if the string $1 FS $2 is larger than variable e, then
exit # exit the script ( stop processing the file )
}
p # if variable p is equal to 1 then print the record (line)
' s="2014-03-27 07:00:00" e="2014-03-27 11:25:00" file
# line above: set variables p and s and specify file name
$1 FS $2
是由字段 1、空格和字段 2 组成的字符串。如果它大于或等于(字符串比较)变量 s,则将变量 p 设置为 1