从文件bash Linux读取

我在使用以下bash脚本时遇到困难:

基本上,脚本执行的操作是接收目录,然后在目录中的所有文件夹中搜索以.log结尾的文件。之后,它应该将这些文件中的所有行(按其写入日期排序)打印到标准输出。

我的剧本是这样的:

#!/bin/bash

find . -name ".*log" | cat *.log |  sort --stable --reverse --key=2,3

当我运行脚本时,它会返回列表,但排序无法正常工作。我的猜测是因为在某些文件中有\ n使其开始新的一行。

是否有一种方法可以忽略文件中的\ n,同时仍使每行返回新行?

谢谢!

从文件bash Linux读取

从文件bash Linux读取

从文件bash Linux读取

xxd命令输出:

ise @ ise-virtual-machine:〜$ xxd /home/ise/Downloads/f1.log 00000000:3230 3139 2d30 382d 3232 5431 333a 3333 2019-08-22T13:33 00000010:3a34 342e 3132 3334 3536 3738 3920 4865:44.123456789他 00000020:6c6c 6f0a 576f 726c 640a 0032 3032 302d llo.World..2020- 00000030:3031 2d30 3154 3131 3a32 323a 3333 2e31 01-01T11:22:33.1 00000040:3233 3435 3637 3839 206c 6174 650a 23456789晚。 ise @ ise-virtual-machine:〜$ xxd /home/ise/Downloads/f2.log 00000000:3230 3139 2d30 392d 3434 5431 333a 3434 2019-09-44T13:44 00000010:3a32 312e 3938 3736 3534 3332 3120 5369:21.987654321 Si 00000020:6d70 6c65 206c 696e 650a mple线。 ise @ ise-virtual-machine:〜$ xxd /home/ise/Downloads/f3.log 00000000:3230 3139 2d30 382d 3232 5431 333a 3333 2019-08-22T13:33 00000010:3a34 342e 3132 3334 3536 3738 3920 4865:44.123456789他 00000020:6c6c 6f0a 576f 726c 6420 320a 0032 3032 llo.World 2..202 00000030:302d 3031 2d30 3154 3131 3a32 323a 3333 0-01-01T11:22:33 00000040:2e31 3233 3435 3637 3839 206c 6174 6520 .123456789晚 00000050:320a 2。

a53932991 回答:从文件bash Linux读取

鉴于日志文件中的条目以\ 0(NUL)结尾,则可以将find,sed和sort组合在一起:

find . -name '*.log' | xargs sed -z 's/\n//g' | sort -z --key=2,3 --reverse
,

假设文件中的每条记录均以日期开头,并且不需要选项--key=2,3,请尝试:

find . -name "*.log" -exec cat '{}' \; | sort -z | xargs -I{} -0 echo "{}"

必须使用最终命令xargs .. echo ..才能正确打印以空字符结尾的行。
如果您仍然需要--key选项,请根据需要修改代码。我目前尚不清楚这些行的样子。

[更新]

根据OP提供的信息,我假设日志文件的格式 将是:

  • 每条记录均以"yyyy-mm-ddTHH:MM:SS.nanosec"格式的日期开头 并且可以应用简单的字典顺序排序。
  • 每个记录均以"\n\0"结尾,但文件的最后一条记录除外 以"\n"结尾。
  • 每条记录的中间部分可能包含换行符 记录以用于折线。

那又如何:

find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z
  • echo -ne "\0"将空字符附加到文件的最后一条记录。 否则,该记录将合并到另一个文件的下一个记录。
  • -z的{​​{1}}选项将空字符视为记录分隔符。
  • 到目前为止,sort不需要其他选项。

OP张贴的输入结果:

sort

它仍然在每个记录的末尾保留空字符2019-08-22T13:33:44.123456789 Hello World 2019-08-22T13:33:44.123456789 Hello World 2 2019-09-44T13:44:21.987654321 Simple line 2020-01-01T11:22:33.123456789 late 2020-01-01T11:22:33.123456789 late 2 。 如果要修剪,请添加"\0"命令 在管道的结尾处为:

tr -d "\0"

希望这会有所帮助。

本文链接:https://www.f2er.com/3164492.html

大家都在问