mar*_*rco 10 sorting logging command-line log-files cat
我有几个日志包含所有以时间戳开头的行,以便以下工作按预期合并它们:
cat myLog1.txt myLog2.txt | sort -n > combined.txt
Run Code Online (Sandbox Code Playgroud)
问题是,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
Run Code Online (Sandbox Code Playgroud)
示例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
Run Code Online (Sandbox Code Playgroud)
预期产出
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
Run Code Online (Sandbox Code Playgroud)
谢谢马可
top*_*opr 19
我正在努力解决同样的问题,最后我想我已经得到了它.尝试这样做:
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.