3

这是一个 SED 问题。

我正在使用 Quartz Composer (Mac OSX) 脚本来:

  1. 从目录中打开最后一个 .log。
  2. 获取该文件的最后一个文本行并删除其前 24 个字符。
  3. 每次在最后一个 .log 中创建新行时显示最后一行

我想这会很简单。目前,我已经在 QC 中完成了这项工作,并且几乎可以正常工作。但是我在getFileName.shgetLastLineOfLog.sh中的 SED 命令都有问题

获取文件名.sh

#!/bin/bash

cd /Users/Me/
/bin/echo `ls -tr *.log | tail -1`

我在这里需要的是打开最后一个 .log 文件,这个名称结构127.0.0.1,NUMBER.log是 NUMBER 部分,一个 5 位数字。数字越大,.log 文件越新。现在,它只打开第一个 .log 文件。

请问您知道如何在 SED 中编写正确的命令吗?

getLastLineOfLog.sh

#!/bin/bash

/usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' > /Users/Me/$1.log
echo `/usr/bin/tail -1 /Users/Me/$1.log`

在第二个文件中,我尝试获取加载的 .log 的最后一个文件,并在不包含 24 个第一个字符的情况下回显它。它可以工作,但会创建一个新的 .log.log。(等)文件每次函数通过时,我想避免的事情。

是否需要将 SED 命令的结果输出到新文件?怎么能做到尽可能简单呢?

先感谢您。

4

3 回答 3

2

如果要按文件名排序:

ls *.log | sort -t, -k2 -n | tail -1
于 2010-11-09T20:43:46.990 回答
1

获取文件名.sh

#!/bin/bash

cd /Users/Me/
ls -tr *.log | tail -1

您不需要echo, 因为它会echo输出它的参数。

getLastLineOfLog.sh

#!/bin/bash

/usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' 

同样在这里,你已经有了最后一行,所以你不需要另一个tail.

编辑:事实上,您也可以通过在 sed 中完成它来摆脱尾巴:

getLastLineOfLog.sh

#!/bin/bash

sed -ne'$s/^.\{24\}//p' /Users/Me/$1
于 2010-11-09T11:34:26.653 回答
1

我知道这是一个非常古老的问题,但这里有两种方法可以仅以 bash 方式获取最后一个文件,而无需管道:

  • 第一种方法:

    : * && echo $_
    

    man bash说:

    $_展开后展开到前一个命令的最后一个参数。

    所以在这里你正在执行命令:(什么都不做),将所有文件作为参数,然后你将使用$_.

  • 第二种方法:

    for lastfile in *; do : ; done
    echo "$lastfile"
    

    通过这种方式,您除了将每个文件分配给其他人之外什么都不做lastfile,最后,您将最后一个文件(按字母顺序说话)保存在lastfile.

于 2015-09-19T22:49:43.077 回答