我是Linux Bash脚本的新手,我现在正在做的是在日志文件中找到ERROR。我怎样才能返回每个日志的时间而不是显示它的所有细节?以下是我的代码:
grep -n "Servlet.service() for servlet default threw exception" error
日志文件的结果之一:
337:17:44:59,136 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/mobilelife].[default]] (http-/0.0.0.0:28080-32) JBWEB000236: Servlet.service() for servlet default threw exception:java.lang.reflect.UndeclaredThrowableException
我想要的结果就是时间,17:44:59,有人可以帮忙吗?
答案 0 :(得分:1)
从grep获取匹配本身的方法是-o
选项,因此您可以首先找到包含ERROR
的所有行并将其传递给另一个grep实例以获取时间戳:< / p>
grep 'ERROR' error | grep -o '^[^,]*'
第二个命令的正则表达式是&#34;从行的开头(^
)匹配尽可能多的非逗号([^,]
)(*
)& #34;
您也可以使用逗号作为分隔符来管道cut
,只打印第一个字段:
grep 'ERROR' error | cut -d , -f 1
或者,使用Perl正则表达式的-P
选项将所有内容放在一个命令中:
grep -Po '^[^,]*(?=.*ERROR)' error
其中括号中的表达式是&#34;前瞻&#34;:该行必须包含.*ERROR
,但它不会成为匹配的一部分。
答案 1 :(得分:1)
如果要在日志文件中搜索特定文本,例如: ALTER TABLE table1 ADD col3 varchar( 30 ) NOT NULL;
UPDATE table1,table2
SET table1.col3=table2.col3
WHERE table1.col1 = table2.col1 AND table1.col2 = table2.col2
,文件中包含许多其他条目,则除了包含搜索字符串的行外,您将需要删除所有其他行的打印,然后只输出该行的相关时间。您可以使用以下内容执行此操作:
Servlet.service() for servlet default threw exception
基本上:
sed -n '/Servlet.service() for servlet default threw exception/s/^[^:]*:\([^,]*\).*$/\1/p' log.file
禁止打印图案空间
-n
在文件中找到特定字符串
/your search string/
仅使用a获取时间
反向参考
s/^[^:]*:\([^,]*\).*$/\1/
打印该行
示例日志文件内容
p
sed使用/输出
$ cat log.file
37:17:44:59,136 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/mobilelife].[default]] (http-/0.0.0.0:28080-32) JBWEB000236: Servlet.service() for servlet default threw exception:java.lang.reflect.UndeclaredThrowableException
37:17:45:00,136 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/mobilelife].[default]] (http-/0.0.0.0:28080-32) JBWEB000236: Servlet.service1() for servlet default threw exception:java.lang.reflect.UndeclaredThrowableException
37:17:45:01,136 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/mobilelife].[default]] (http-/0.0.0.0:28080-32) JBWEB000236: Servlet.service2() for servlet default threw exception:java.lang.reflect.UndeclaredThrowableException
答案 2 :(得分:0)
假设时间模式没有出现在其他地方
grep -oP "(?<=:)(\d{2}:){2}\d{2}(?=.*ERROR)"
或awk
救援!
$ awk -F, '/ERROR/{sub(/^[0-9]+:/,""); print $1}' log
17:44:59