系统日志文件是序列化的,我用ls -lrt
它来显示最新的文件。然后我cat
那个文件。这需要每次输入很长的序列号。
如何在一个命令中cat
出现在输出中的最后一个文件?ls -lrt
我正在使用 cygwin,其输出ls -lrt foobar_job*
如下所示:
-
-rw-r--r-- 1 zundarz Domain Users 1133 Jul 31 16:54 foobar_job4855125.log
-rw-r--r-- 1 zundarz Domain Users 1256 Jul 31 17:10 foobar_job4855127.log
-rw-r--r-- 1 zundarz Domain Users 1389 Aug 11 10:20 foobar_job4887829.log
-rw-r--r-- 1 zundarz Domain Users 1228 Aug 11 10:39 foobar_job4887834.log
答案1
如果您只想cat
在一个命令中使用最新的文件,那么您实际上不需要-l
选项。打开后Linux
,Cygwin
您可以使用-1
选项并使解析变得更加容易:
$ cat "$(ls -1rt | tail -n1)"
-1
应该非常便携,它在POSIX。
还要记住解析ls
输出有其缺点。
编辑:
正如正确指出的评论者:don_crissti你甚至不需要-1
:
$ cat "$(ls -rt | tail -n1)"
答案2
此方法在正确性方面得分不高,但在大多数情况下应该有效:cat "$(ls -1t | head -n1)"
答案3
在我的系统上尝试了一下:
~$ cat "$(ls -lrt | tail -n 1 | tr -s ' ' | cut -d ' ' -f9-)"
工作了。
ls -lrt
-t
以相反顺序 ( )给出按修改时间 ( ) 排序的文件-r
。
tail -n 1
为您提供输出的最后一行。
tr -s ''
删除行中的重复空格。
cut -d ' ' -f9-
剪切每个空格的行并给出第 9 个字段,即文件名。添加-
到-f9
还会给出所有以下字段,这对于包含空格的文件名很重要。
别名
如果要将命令用作别名,则必须对字符进行转义"
。
命令中的' 是必需的,因为文件可以有空格,如果没有用'括起来,"
该命令将被解释为多个文件。cat
"
逃离这个标志也是必要的$
。否则,内部命令$(...)
将在设置别名时执行一次,而不是每次调用别名时都执行。
alias catrec="cat \"\$(ls -lrt | tail -n 1 | tr -s ' ' | cut -d ' ' -f9-)\""
答案4
Bash 一行(前提是你的文件名不包含空格):
cat $(ls -lrt | tail -1 | rev | cut -d" " -f1 | rev)
解释:
tail -1 # get last line of your ls
rev # reverse characters order
cut -d" " -f1 # take first field using space as a separator
因此,这rev | cut -d" " -f1 | rev
是一个技巧,可以确保获得最后一个空格分隔的单词,而不必提供与平台相关的字符偏移量字段号。