2010-11-09 66 views
2

這是一個SED問題。SED,獲取最後一個文件名

我在石英作曲家工作(Mac OSX版)的腳本:

  1. 打開從目錄中的最後一個日誌。
  2. 獲取該文件的最後文本行並刪除其24個字符。
  3. 顯示最後一行每一個新的最後.LOG

內部創建的時候,我認爲這將是如此簡單。此時此刻,我在QC中完成了這項工作,而且幾乎可以工作。但我有問題與SED的命令都getFileName.shgetLastLineOfLog.sh

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命令的結果輸出到新文件?它如何儘可能簡單地完成?

預先感謝您。

回答

2
如果要通過文件名排序

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

非常感謝vlabrecque。 – Pablo 2010-11-09 23:17:48

1

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 
+0

ls -tr將按修改時間排序,而不是文件名。 – 2010-11-09 11:45:27

+0

執行'ls -rtl'來檢查修改時間;我猜他們不匹配文件名的順序。 – 2010-11-09 11:45:55

+0

嗨,道格拉斯,謝謝你的回答。但現在在第一種情況下,它像以前一樣工作,加載第一個文件而不是最後一個文件。即我有127.0.0.1,50454.log和127.0.0.1,50604.log,並打開第一個。我需要打開最後一個.log文件。你知道如何安排SED命令來打開最後的.log文件嗎?再次感謝你。 – Pablo 2010-11-09 11:45:59

1

我知道這是一個很古老的問題,但這裏有兩種方法可以得到一個bash的最後一個文件只有這樣,沒有管道:

  • 第一種方法:

    : * && echo $_ 
    

    man bash說:

    $_展開後展開到上一個命令的最後一個參數。

    所以在這裏你執行命令:(什麼都不做)的所有文件作爲參數,然後你得到他們最後與$_

  • 方法二:

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

    這樣你在做什麼,但每個文件分配給lastfile所以,到了最後,你必須在最後一個文件(按字母順序說話)保存在lastfile