如何仅从grepping返回特定文本

时间:2016-03-17 02:00:46

标签: linux bash terminal grep

我是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,有人可以帮忙吗?

3 个答案:

答案 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