我有几个日志,其中包含所有以时间戳记开头的行,因此以下各项可以按预期的方式进行合并:
cat myLog1.txt myLog2.txt | sort -n > combined.txt
问题是myLog2.txt也可以包含没有时间戳的行(例如Java堆栈跟踪)。是否有没有任何自定义脚本的简单方法仍然可以合并它们并保留多行内容?
示例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
示例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
和-m
组合在一起可以防止堆栈跟踪行聚类。我保留它是为了防止大多数stacktrace行以空格开头。-n
显然只要密钥中包含非数字字符,就会停止比较密钥。这是保持堆栈跟踪到位的第二个关键要素。重要的是,如果它是-n -k1,1
,它将只按小时对日志文件进行排序,因为冒号是非数字的。除此之外,-n
可以加快数值比较的速度,因此我们还是希望如此。
通过指向每个键中的特定字符位置可以解决上一点中提到的问题,这就是为什么-k1.1,1.2
(小时的第一和第二位数字)-k1.4,1.5
(分钟的第一和第二位数字)等等的原因。点之前的第一个数字始终为“ 1”,因为它指向文件行的第一列(在我们的情况下是时间)。很快是-kA,B
,其中A
和B
是给定行中的列位置(默认情况下,行由空格分隔)。使用的A和B的格式为..请记住,只要在A
和B
之间使用非数字字符,则使用-n
时,后面的所有内容都会被忽略。-s
禁用默认行为:每当进行比较的键与同一行的完整字符串比较都完成时。我们不希望这样保留原始日志条目的顺序。但是不确定-m
是否必要。