我有几个包含所有以时间戳开头的行的日志,因此以下内容可以按预期合并它们:
cat myLog1.txt myLog2.txt | sort -n > combined.txt
问题是,myLog2.txt 还可以包含没有时间戳的行(例如 java 堆栈跟踪)。有没有一种简单的方法,无需任何自定义脚本即可合并它们并保留多行内容?
Example myLog1.txt
11:48:18.825 [main] INFO org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
11:48:55.784 [main] INFO o.h.tool.hbm2ddl.SchemaUpdate - HHH000396: Updating schema
Example myLog2.txt
11:48:35.377 [qtp1484319352-19] ERROR c.w.b.c.ControllerErrorHandler -
org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'org.joda.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat org.joda.time.LocalDate for value '[2013-03-26]'; nested exception is java.lang.IllegalArgumentException: Invalid format: " [2013-03-26]"
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:68) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:45) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:595) ~[spring-context-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:98) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) ~[spring-web-3.2.1.RELEAS
预期产出
11:48:18.825 [main] INFO org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
11:48:35.377 [qtp1484319352-19] ERROR c.w.b.c.ControllerErrorHandler -
org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'org.joda.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.web.bind.annotation.RequestParam @org.springframework.format.annotation.DateTimeFormat org.joda.time.LocalDate for value '[2013-03-26]'; nested exception is java.lang.IllegalArgumentException: Invalid format: " [2013-03-26]"
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:68) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:45) ~[spring-beans-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:595) ~[spring-context-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:98) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) ~[spring-web-3.2.1.RELEAS
11:48:55.784 [main] INFO o.h.tool.hbm2ddl.SchemaUpdate - HHH000396: Updating schema
谢谢
马可
我一直在为同样的问题而苦苦挣扎,最后我想我已经解决了。尝试这样做:
sort -nbms -k1.1,1.2 -k1.4,1.5 -k1.7,1.8 -k1.10,1.12 myLog1.txt myLog2.txt > combined.txt
我自己仍然不太清楚,但我会尝试给出一些解释。根据手册页,使用的开关意味着:
-n, --numeric-sort - 根据字符串数值进行比较。
-b, --ignore-leading-blanks - 忽略前导空白。
-s, --stable - 通过禁用最后手段比较来稳定排序
-m, --merge - 合并已经排序的文件;不排序
-k, --key=POS1[POS2] - 在 POS1(原点 1)处开始密钥,在 POS2 处结束(默认行尾)
- 日志文件已经排序,因此我们不需要再次对它们进行排序,只需确定合并时哪一行去哪里。这就是为什么
-m
。防止堆栈跟踪混乱至关重要。
-
-b
在这种情况下没有必要,因为不知何故-n
and -m
组合可以防止堆栈跟踪行聚集。我留下它是为了以防万一,因为大多数堆栈跟踪行都以空格开头。
-
-n
每当密钥中存在非数字字符时,显然就会停止比较密钥。这是保持堆栈跟踪到位的第二个关键点。重要的是如果是的话-n -k1,1
它只会按小时对日志文件进行排序,因为冒号不是数字。除此之外-n
加速数字比较,所以无论如何我们都想要它。
- 上一点提到的问题是通过指向每个键中的特定字符位置来解决的,这就是为什么
-k1.1,1.2
(小时的第一个和第二个数字)-k1.4,1.5
(分钟的第一个和第二个数字)等等。点之前的第一个数字始终为“1”,因为它指向文件行的第一列(在我们的例子中是时间)。不久之后就是-kA,B
where A
and B
是给定行中的列位置(默认情况下,行由空格分隔)。 A 和 B 使用的格式是 .. 请记住,只要 A 和 B 之间有非数字字符A
and B
如果比较的话,它后面的所有内容都会被忽略-n
used.
-
-s
禁用默认行为,即:只要进行比较的键是相同的完整字符串,就会完成行的比较。我们不希望保留原始日志条目的顺序。不确定是否有必要-m
though.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)