[英]Reading from file bash Linux
我很难使用以下 bash 脚本:
基本上,脚本所做的是接收一个目录,然后在目录中的所有文件夹中搜索以.log 结尾的文件。 之后,它应该将这些文件中按写入日期排序的所有行打印到标准输出。
我的脚本是这样的:
#!/bin/bash
find . -name ".*log" | cat *.log | sort --stable --reverse --key=2,3
当我运行脚本时,它会返回列表,但排序无法正常工作。 我的猜测是因为在某些文件中有 \n 这使它开始一个新行。
有没有办法忽略文件中的 \n 而仍然让每一行返回一个新行?
xxd 命令 output:
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 He 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 late. ISE@ISE-VIRTUAL-MACHINE:〜$ xxd/home/ise/downloads/f2.log 00000000:3230 3139 2D30 392D 392D 3434 5431 333A 343A 3434 2019-09-09-44T13:44 Si 00000020: 6d70 6c65 206c 696e 650a 多线。 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 He 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 late 00000050: 320a 2.
鉴于日志文件中的条目以 \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"
将 null 字符附加到文件的最后一条记录。 否则该记录将被合并到另一个文件的下一条记录。sort
的-z
选项将 null 字符视为记录分隔符。sort
选项。OP 发布输入的结果:
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
它仍然在每条记录的末尾保留 null 字符"\0"
。 如果要修剪它,请在管道末尾添加tr -d "\0"
命令:
find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z | tr -d "\0"
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.