Linux:grep用于在某个日期在日志文件中显示多个字符串

Linux:grep用于在某个日期在日志文件中显示多个字符串,linux,grep,Linux,Grep,抱歉,这是一个看似常见的问题,但其他线程的答案对我来说并不适用。我试图搜索的日志的格式如下: Jul 24 23:11:08 TG-12345 gateway [words] Tools 987654321 Join request 我想在/var/etc/messages中找到日期的所有实例的日志,在本例中是'Jul 24',在'987654321'。做这件事的正确说明是什么?多谢各位 编辑:虽然没有必要,但如果你知道如何在同一搜索中加入时间框架(小时,而不是日期),那就太好了;但我至少需要

抱歉,这是一个看似常见的问题,但其他线程的答案对我来说并不适用。我试图搜索的日志的格式如下:

Jul 24 23:11:08 TG-12345 gateway [words] Tools 987654321 Join request
我想在/var/etc/messages中找到日期的所有实例的日志,在本例中是'Jul 24',在'987654321'。做这件事的正确说明是什么?多谢各位


编辑:虽然没有必要,但如果你知道如何在同一搜索中加入时间框架(小时,而不是日期),那就太好了;但我至少需要日期和工具——先工作。再次感谢。

只需使用命令两次:

grep 'Jul 24' <filename> | grep '987654321'
grep'Jul 24'| grep'987654321'
这里的秘密是使用表示“任何字符”的
和表示“0或更多”的量词
*
。有关其他元字符的详细信息,请阅读

对于时间范围,可以使用范围。这将得到从7月10日到7月29日包含987654321的所有内容--

任何比这更复杂的事情都需要进行算术比较,而不是模式匹配。我经常用awk来做这个。例如,这将从每个压缩和未压缩的消息日志文件中获取从6月12日到6月18日以及从7月20日到7月25日期间包含987654321的所有内容--


zcat-f/var/log/messages*| grep987654321 | awk'($1==“Jun”&&&&$2>=12&&$3=20&&$3我通常只做这件事:

grep 'Jul 24' /var/etc/messages | grep 987654321

搜索范围,可以使用
sed
,如下所示:

sed -n '/Jul 24/,/Jul 27/p' file
sed -n '/Jul 24/,/Jul 27/p' file | grep 987654321
这将打印(包括)包含
Jul 24
Jul 27
的行之间的所有行。
-n
标志抑制未明确打印的输出(此处使用
p
命令)。使用
/pattern1/,/pattern2/
可以选择第一个和第二个模式之间的所有行(在本例中为文字字符串)

这不限于日期,您可以指定小时/分钟/等:

sed -n '/Jul 24 22:/,/Jul 24 23:/p' file
只需确保模式出现在文件中,否则
sed
将无法匹配块的开始/结束(因为它是文本匹配,而不是实际的日期范围匹配)。例如,如果您对结束模式过于具体,如
Jul 24 23:59:59
,而该值实际上从未出现在文件中,
sed
将愉快地一直打印到文件结束

完成
sed
“预选”后,您可以只
grep
输出其他模式,如下所示:

sed -n '/Jul 24/,/Jul 27/p' file
sed -n '/Jul 24/,/Jul 27/p' file | grep 987654321
实际上,您可以使用一个
sed
命令:

sed -n '/Jul 24/,/Jul 27/ { /987654321/p }' file
如果你愿意的话。

也可以试试awk

awk '/Jul 24/ && /987654321/'  Input_file

说明:在一行中查找字符串“Jul 24”和数字“987654321”,因此&&condition将确保它们都在一行中。如果它们在一行中,则它将打印该行(虽然此处未写入打印,但awk使用条件/操作方法,当不存在任何操作时,默认情况下将打印行)。

如果您不需要100%的精度,并且打算手动查看日志(这可能会引发误报)7月24日试试
987654321.
@blindside044,我看到了你关于小时范围匹配的更新,并更新了答案。你能检查一下它现在是否回答了你的问题吗?@TobySpeight,谢谢你发现它,我现在成功添加了它。
awk '/Jul 24/ && /987654321/'  Input_file