2010-03-18 34 views
0

問候,改進的技術將文件名存儲在變量中?

我需要將日誌的文件名存儲到變量中,以便我的腳本可以對日常日誌文件執行一些檢查。這些日誌通常具有不同的名稱,因爲它們在名稱中有時間戳。目前,我正在使用hodge podged方法來管理ls命令sed,sort,cut和tail以獲取名稱。

CRON_LOG=$(ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log 2> /dev/null | sed 's/^[^0-9][^0-9]*\([0-9][0-9]*\).*/\1 &/' | sort -n | cut -d ' ' -f2- | tail -1) 

UPDATE:

$ CRON_DATE作爲參數傳遞給腳本提供。這是創建日誌的日期(至今)。有時會有多個日誌在同一天存在,所以我希望這可以獲得最近的日誌。

一些典型的文件名:
fetch_cron_false_031810090452.log
fetch_cron_true_031310090001.log
等等

請記住,這個工程原樣。我只是覺得這很醜陋,而且正試圖找到一個更好的方法來實現它。

我很確定我從幾個月前發現谷歌的一些東西一起kluged這一點。它現在有效,但我對這項技術並不滿意。我有一些關於如何更好地實現這一點的想法,但是我之前在這個網站上取得了巨大的成功,並且認爲最好先引用stackoverflow神。所有的答案非常感謝。

感謝, 瑞安

+0

您需要在此處提供更多輸入。典型的文件名是什麼?你想得到什麼日誌文件?什麼是'$ CRON_DATE'? – 2010-03-18 22:45:54

+1

已更新。謝謝你的提示。 – SDGuero 2010-03-18 22:59:16

+1

我會告訴你現在會改善這種情況 - 將這一過程分解爲幾項操作。做一個這樣的單線程是稍後查看代碼並讓自己做facepalm的好方法。可讀性總是比聰明的更好; 0) – 2010-03-18 23:01:41

回答

2

如何

CRON_LOG=$(ls -c $LOGS_DIR/fetch_cron_*$CRON_DATE* | head -1) 

編輯:你說得對BTA,我應該抓住這一點。固定。

+1

這將得到最新的日誌,但我認爲OP希望從指定日期(通過'$ CHRON_DATE'傳入)獲取最近的日誌。 – bta 2010-03-19 01:20:08

+0

比我現在做的要乾淨得多。謝謝! :D – SDGuero 2010-03-19 21:09:40

1

你分析一個日誌文件後,做一些標記,它已被處理,這樣的重命名,或將其移動到不同的文件夾。這樣,文件創建時就沒有關係,只是它還沒有被解析。

我還建議使用更高級別的腳本語言。

0

你可以改變你的日期由前綴前面的年可排序,然後做

CRON_LOG=$(ls ${LOGS_DIR}/fetch_cron_{false,true}_${CRON_DATE}*.log| tail -1) 
+0

這不會起作用,因爲所有的「false」日期都會在任何「真」日期之前按字母順序排列,無論年份是否帶前綴。您需要另外一步從文本中刪除日期。 – bta 2010-03-19 01:21:57

+0

請注意,OP提到他的命令是按原樣工作的。 – ghostdog74 2010-03-19 01:33:41

1
#!/bin/bash 
shopt -s nullglob 

last= 
for file in "$LOGS_DIR"/fetch_cron_{false,true}_"$CRON_DATE"*.log 
do 
    last="$file" 
done 

if [ -n "$last" ] 
then 
    echo "$last" 
else 
    echo "No match found" >&2 
    exit 1 
fi 
+0

嗯。這很有趣...我喜歡這個陷阱,並且會進一步思考這個問題。謝謝。 – SDGuero 2010-03-19 21:16:42

1

對於初學者來說,嘗試:

FILELIST=`ls -1 $LOGS_DIR/fetch_cron_{true,false}_$CRON_DATE*.log` 
CRON_LOG=`echo $FILELIST | tr -d [:alpha:][:punct:] | sort -n | tail -1` 

這擺脫的cut和換sed更易讀(IMO)呼叫的正則表達式爲tr。將它分成兩行有助於提高清晰度。

如果你沒有在$LOGS_DIR任何其他文件具有極爲相似的文件名(如果保持在日誌中質疑自己的文件夾這通常發生),你可以用更簡單的東西像$LOGS_DIR/fetch_*_$CRON_DATE*.log更換參數ls。爲了簡單起見,請不要使該行比確保只獲取所需文件所需的更復雜。

+0

謝謝BTA。我選擇了你的第一個,但後來看到測試版下面(你幫助修復),這也工作。我將使用該解決方案,但感謝您的幫助。 – SDGuero 2010-03-19 21:09:06