Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
Linux bash脚本-从文件夹中选择的文件打印X行_Linux_Bash - Fatal编程技术网

Linux bash脚本-从文件夹中选择的文件打印X行

Linux bash脚本-从文件夹中选择的文件打印X行,linux,bash,Linux,Bash,我正在尝试编写一个脚本,帮助跟踪我的应用程序日志 我的应用程序的日志以以下模式写入“var/log/MyLogs/”: runningNumber_XXX.txt , for example: 0_XXX.txt 37_xxx.txt 99_xxx.txt 101_xxx.txt 103_xxx.txt 我正在尝试编写一个bash脚本(目前尚未成功),它将打印最后一个日志文件的最后20行(最后一个日志文件是前缀号最大的文件) 我知道我需要检查文件夹中的文件(对于/var/log/MyLogs/

我正在尝试编写一个脚本,帮助跟踪我的应用程序日志

我的应用程序的日志以以下模式写入“var/log/MyLogs/”:

runningNumber_XXX.txt , for example:
0_XXX.txt
37_xxx.txt
99_xxx.txt
101_xxx.txt
103_xxx.txt
我正在尝试编写一个bash脚本(目前尚未成功),它将打印最后一个日志文件的最后20行(最后一个日志文件是前缀号最大的文件)

我知道我需要检查文件夹中的文件(对于/var/log/MyLogs/*中的文件),检查哪个文件名的前缀最大,然后打印所选文件的最后20行

请帮帮我

谢谢

find /var/log/MyLogs -iname '*_xxx.txt' | sort -n | tail -1 | xargs tail -20
  • 获取正确的文件
  • 按数字排序
  • 获取最后一个日志文件
  • 最后20行

tail-20$(ls-1/var/log/MyLogs/*.*.*.*.txt | sort-n-t.-k 1-r | head-1)
在shell脚本中使用
ls
通常是不好的做法,但如果您可以确保日志文件不包含空格和其他奇怪字符,您可以使用一个简单的:

tail -20 $(ls -t1 /var/log/[0-9]*_XXX.txt | head -1)
委员会:

  • ls-t
    对文件进行排序我的最新修改时间排在第一位
  • 第一个
  • tail
    打印最后一行

同样,这通常是一种不好的做法,只有当你知道自己在做什么时,你才能使用它。

谢谢(但如果我有:99_xxx.txt和103_xxx.txt,它会给我99_xxx.txt的内容)。@user3668129
-n
标记使它将排序键视为一个数字,而不是字符串。从技术上讲,此解决方案不是100%正确的。文件名可能不仅包含空格(这是您与@Vijay讨论的主要原因),还包含那些“奇怪的符号”,包括“\n”。因此正确的解决方案意味着
find-print0
和随后在输出流中处理“\0”的“舞蹈”(
xargs-0
在某些情况下会有所帮助,但无
排序
,无
尾部
等)。但正如@Vijay合理地说的,日志文件名通常不包含任何“坏符号”,因此在这种特殊情况下,所有这些预防措施都是过度的。虽然我不会否决你的意见,但这很好。
tail -20 $(ls -t1 /var/log/[0-9]*_XXX.txt | head -1)