Bash SED,获取最后一个文件名

Bash SED,获取最后一个文件名,bash,sed,quartz-composer,Bash,Sed,Quartz Composer,这是一个SED问题 我正在使用Quartz Composer(Mac OSX)脚本: 从目录中打开最后一个.log 获取该文件的最后一行文本并删除其前24个字符 每次在last.log中创建新行时显示最后一行 我想这很简单。目前,我已经在QC中完成了这项工作,并且几乎可以正常工作。但是我对getFileName.sh和getLastLineOfLog.sh中的SED命令都有问题 #!/bin/bash /usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\

这是一个SED问题

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

  • 从目录中打开最后一个.log
  • 获取该文件的最后一行文本并删除其前24个字符
  • 每次在last.log中创建新行时显示最后一行
  • 我想这很简单。目前,我已经在QC中完成了这项工作,并且几乎可以正常工作。但是我对getFileName.sh和getLastLineOfLog.sh中的SED命令都有问题

    #!/bin/bash
    
    /usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' 
    
    #!/bin/bash
    
    sed -ne'$s/^.\{24\}//p' /Users/Me/$1
    
    getFileName.sh

    #!/bin/bash
    
    cd /Users/Me/
    ls -tr *.log | tail -1
    
    这里我需要的是打开最后一个.log文件,其名称结构为127.0.0.1,NUMBER.log是一个5位数的数字。数字越高,.log文件越新。现在,它只打开第一个.log文件

    你知道如何用SED写正确的命令吗

    getLastLineOfLog.sh

    #!/bin/bash
    
    /usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' 
    
    #!/bin/bash
    
    sed -ne'$s/^.\{24\}//p' /Users/Me/$1
    
    在第二个文件中,我尝试获取加载的.log的最后一个文件,并在没有前24个字符的情况下对其进行回显。它可以工作,但是创建一个新的.log.log。(等)每次函数通过时都要提交一个文件,这是我希望避免的事情

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

    提前感谢您。

    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\}//' 
    
    #!/bin/bash
    
    sed -ne'$s/^.\{24\}//p' /Users/Me/$1
    
    与此类似,您已经有了最后一行,因此不需要另一个
    尾部

    编辑: 事实上,您也可以通过在sed中执行此操作来摆脱尾部:

    getLastLineOfLog.sh

    #!/bin/bash
    
    /usr/bin/tail -1 /Users/Me/$1 | sed 's/^.\{24\}//' 
    
    #!/bin/bash
    
    sed -ne'$s/^.\{24\}//p' /Users/Me/$1
    

    如果要按文件名排序,请执行以下操作:

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

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

    • 第一种方法:

      : * && echo $_
      
      manbash
      说:

      $\uu
      展开到展开后上一个命令的最后一个参数

      因此,您在这里执行命令
      (不执行任何操作),将所有文件作为参数,然后使用
      $\uuu
      获取最后一个文件

    • 第二种方法:

      for lastfile in *; do : ; done
      echo "$lastfile"
      
      通过这种方式,您只需将每个文件分配给
      lastfile
      ,这样,最后一个文件(按字母顺序)就会保存在
      lastfile


    ls-tr将按修改时间而不是文件名进行排序。执行
    ls-rtl
    检查修改时间;我猜它们与文件名顺序不匹配。嗨,道格拉斯,谢谢你的回答。但是现在在第一种情况下,它像以前一样工作,加载第一个文件而不是最后一个文件。也就是说,我有127.0.0.150454.log和127.0.0.150604.log,它会打开第一个。我需要打开最后一个.log文件。您知道如何安排SED命令来打开最后的.log文件吗?再次感谢您。您好,我尝试了ls-rtl*.log | tail-1,它输出“不是这样的文件或目录”。然后您在该目录中没有任何*.log文件。非常感谢您。