Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本具有来自awk的输出,该输出组合了多个日志文件,无法对最终输出进行正确排序_Bash_Sorting - Fatal编程技术网

Bash脚本具有来自awk的输出,该输出组合了多个日志文件,无法对最终输出进行正确排序

Bash脚本具有来自awk的输出,该输出组合了多个日志文件,无法对最终输出进行正确排序,bash,sorting,Bash,Sorting,我有一个Bash脚本,它对日志目录执行一些awk魔术,并将结果合并到一个文件中。。。问题是日志包含第1行的日期和第2行的数据、第3行的日期和第4行的数据,等等。因此,当我对其排序时,所有日期都在顶部排序,所有数据都在底部排序。。。顺便说一下,日期不符合顺序,因此我想对它们进行排序,使它们符合 有没有办法每两行分组,然后根据分组的第一行进行排序 日期和数据分别在两行上 执行出现在每个日期行的末尾,所以我确信这可能是关键,但不确定使用什么工具来实现这一点 下面是预排序输出的示例 2014-07-27

我有一个Bash脚本,它对日志目录执行一些awk魔术,并将结果合并到一个文件中。。。问题是日志包含第1行的日期和第2行的数据、第3行的日期和第4行的数据,等等。因此,当我对其排序时,所有日期都在顶部排序,所有数据都在底部排序。。。顺便说一下,日期不符合顺序,因此我想对它们进行排序,使它们符合

有没有办法每两行分组,然后根据分组的第一行进行排序

日期和数据分别在两行上

执行出现在每个日期行的末尾,所以我确信这可能是关键,但不确定使用什么工具来实现这一点

下面是预排序输出的示例

2014-07-27 12:01:01,893] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:161086252)
2014-07-27 12:00:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
2014-07-27 12:01:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
2014-07-27 12:00:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
2014-07-27 12:00:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
下面是post排序的示例(sort some_file.log)

下面是所需输出的示例

2014-07-27 12:00:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
2014-07-27 12:00:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
2014-07-27 12:00:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
2014-07-27 12:01:01,428] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:1961536860)
2014-07-27 12:01:01,893] [xxxxxxxxxxx] [ERROR] [xxxxxxxxxx] [xxxxxxxxxxx] EXECUTING
[5205003] Unable to find a user for user name or alias xxxxxx in group default. (Ref:161086252)
Rici下面的答案对我来说很有用

cat  test.log | paste - - | sort | sed 's/\t/\n/' > testsort

您可以按第一列的值进行排序,如下所示

 sort -k1,1nr -k2,2 logfile

正如@chrisaycock在一篇评论中所指出的,如果日期和数据在同一行,您可以轻松地对它们进行排序。如果你没有一个简单的方法在你的“awk魔术”中做到这一点,你可以事后再做;如果你确定某个字符不在任何日期行中,这将很容易,如果该字符是TAB,则更容易

如果您知道任何日期行中都没有制表符:

如果日期行中有制表符,但没有|:

调用
粘贴---
从标准输入中一次读取两行,并输出它们,以分隔符分隔(默认选项卡,用
-d
标志覆盖)。您可以通过使用更多的
-
来扩展它,并且可以指定一系列分隔符:

$ seq 1 9 | paste -d:+ - - -
1:2+3
4:5+6
7:8+9

如果您发布代码的相关部分,这样人们就可以帮助您完成所需的行为,这会更有帮助。如果日期和相应的数据在同一行,您可以使用排序。是否有什么原因导致使用
粘贴--
的解决方案不适合您?如果是,你能解释一下为什么不吗?没有标签。根据你的回答,我有一些东西在起作用,但它是在日期线之外减少执行,这不是世界末日,但我不希望太晚。下面是我正在运行的命令:cat test.log | paste---| sort | sed's/EXECUTING/\n/'>>tests。我重新运行了Rici的第一个命令,结果正如预期的那样。。。工作原理如下:->$cat test.log |粘贴--|排序| sed's/\t/\n/'>testsort日志文件中没有选项卡,只有纯文本,但分隔符可以工作。。。在每个日期行的末尾执行一个术语,在数据行的末尾执行一个术语(Ref:xxxxxxxx),尽管它并不总是包含相同数量的字符。我有一些工作的基础上上述,但它是削减了执行的日期线,这不是世界末日,但我宁愿不要太多。[cat test.log | paste--| sort | sed's/EXECUTING/\n/'>>testsort]实际上,我重新运行了您的第一个命令,并按预期工作。。。我已经编辑了主要部分,下面是工作原理:->$cat test.log |粘贴--|排序| sed的/\t/\n/'>testsort
awk magic files | paste - - | sort | sed 's/\t/\n/'
awk magic files | paste -d'|' - - | sort | sed 's/|/\n/'
$ seq 1 9 | paste -d:+ - - -
1:2+3
4:5+6
7:8+9