Linux:grep在某个日期的日志文件中有多个字符串

时间:2017-07-25 20:23:13

标签: linux grep

抱歉看似常见问题,但其他帖子的答案对我不起作用。我试图搜索的日志格式如下:

Jul 24 23:11:08 TG-12345 gateway [words] Tools 987654321 Join request

我想要查看/ var / etc / messages中找到的所有日期实例的日志,让我们说'7月24日'在这种情况下,和' 987654321'。这样做的正确指示是什么?谢谢。

编辑:虽然没有必要,但如果你知道如何在同一个搜索中投入一个时间范围(小时,而不是日期),那就太棒了;但我确实至少需要日期和工具#工作。再次感谢。

5 个答案:

答案 0 :(得分:3)

只需使用该命令两次:

grep 'Jul 24' <filename> | grep '987654321'

答案 1 :(得分:1)

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

sed -n '/Jul 24/,/Jul 27/p' file

这将打印包含Jul 24Jul 27的行之间的所有行(包括)。 -n标志禁止未明确打印的输出(此处带有p命令)。 /pattern1/,/pattern2/regex address,我们使用它选择第一个和第二个模式之间的所有行(在本例中为文字字符串)。

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

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 | grep 987654321 ,如下所示:

sed

实际上,您可以使用单个sed -n '/Jul 24/,/Jul 27/ { /987654321/p }' file 命令执行此操作:

NotificationCompat.Builder mBuilder =
         new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.app_logo)
                .setContentTitle("My notification")
                .setContentText("Hello World!");

如果你愿意的话。

答案 2 :(得分:0)

grep 'Jul 24.*987654321' /var/log/messages

这里的秘密是使用metacharacter .,这意味着&#34;任何角色&#34;和量词*含义&#34; 0或更多&#34;。有关其他元字符的更多信息,请阅读regular expressions

对于时间范围,您可以使用范围。从7月10日到7月29日,这将包含987654321 -

grep 'Jul [12].*987654321' /var/log/messages

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

zcat -f /var/log/messages* | grep 987654321 | awk '($1 == "Jun" && $2 >= 12 && $3 <= 18) || ($1 == "Jul" && $2 >= 20 && $3 <= 25)'

答案 3 :(得分:0)

我通常只是这样做:

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

答案 4 :(得分:0)

尝试使用awk。

openpyxl

说明:在一行中查找字符串“Jul 24”和编号“987654321”,因此&amp;&amp;条件将确保它们都在一条线上。如果它们出现在一行上,那么它将打印该行(虽然打印不是在这里写的,但awk适用于条件/动作的方法,当没有动作时,它将默认打印行。)