【问题标题】:SED, Getting the last file nameSED,获取最后一个文件名
【发布时间】:2010-11-09 11:21:15
【问题描述】:

这是一个 SED 问题。

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

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

我认为这很简单。目前,我已经在 QC 中完成了这项工作,并且几乎可以正常工作。但我在 getFileName.shgetLastLineOfLog.sh

中的 SED 命令都有问题

getFileName.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 命令的结果输出到新文件?怎么能做到尽可能的简单呢?

提前谢谢你。

【问题讨论】:

    标签: bash sed quartz-composer


    【解决方案1】:

    如果你想按文件名排序:

    ls *.log | sort -t, -k2 -n | tail -1
    

    【讨论】:

    • 非常感谢 vlabrecque。
    【解决方案2】:

    getFileName.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
    

    【讨论】:

    • ls -tr 将按修改时间排序,而不是文件名。
    • ls -rtl检查修改时间;我猜它们与文件名顺序不匹配。
    • 您好,Douglas,感谢您的回答。但现在在第一种情况下,它像以前一样工作,加载第一个而不是最后一个文件。 IE。我有 127.0.0.1,50454.log 和 127.0.0.1,50604.log,它会打开第一个。我需要打开最后一个 .log 文件。您知道如何安排 SED 命令打开最后一个 .log 文件吗?再次感谢您。
    • 嗨,我试过 ls -rtl *.log | tail -1 它输出“不是这样的文件或目录”。
    • 那么您在该目录中没有任何 *.log 文件。
    【解决方案3】:

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

    • 第一种方法:

      : * && echo $_
      

      man bash 说:

      $_ 扩展为上一个命令的最后一个参数,在扩展之后。

      所以在这里,您正在执行命令 :(什么都不做),将所有文件作为参数,然后您将使用 $_ 获取最后一个文件。

    • 第二种方法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-01
      • 2013-08-29
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多