2015-02-23 67 views
0

例如,我從2015年2月16日至20日有以下日誌文​​件。現在,我要創建一個名爲,mainentrywatcherReport_2015-02-16_2015-02-20.log。換言之,我想從周的第一個和最後一個文件(週一到週五)提取日期格式,並在每個星期六創建一個輸出文件。我將在每個星期六使用cron觸發腳本。將所有文件追加到unix中的一個文件中,並用第一個和最後一個文件名的一部分重命名輸出文件

$ ls -l 
mainentrywatcher_2015-02-16.log 
mainentrywatcher_2015-02-17.log 
mainentrywatcher_2015-02-18.log  
mainentrywatcher_2015-02-19.log 
mainentrywatcher_2015-02-20.log 

$ cat *.log >> mainentrywatcherReport_2015-02-16_2015-02-20.log 
$ mv *.log archive/ 

任何人都可以幫助如何將輸出文件重命名爲上述格式?

+0

您可以使用'head'和'tail'來獲取目錄中的第一個和最後一個文件名。 – dimo414 2015-02-23 18:28:15

+0

'head','tail'和一些字符串操作('cut' /'grep',http://tldp.org/LDP/abs/html/string-manipulation.html,...) – 2015-02-23 18:28:16

回答

0

也許嘗試這樣:

parta=`ls -l | head -n1 | cut -d'_' -f2 | cut -d'.' -f1` 
partb=`ls -l | head -n5 | cut -d'_' -f2 | cut -d'.' -f1` 
filename=mainentrywatcherReport_${parta}_${partb}.log 
cat *.log >> ${filename} 
  • 的 「ls -l」 輸出中的問題進行說明
  • 「頭-NX」 需要輸出
  • 的第X個行「切-d'_'-f2「取第一個下劃線後的所有內容(保留)
  • 」cut -d'。' -f1「倍第一個時間段前的所有內容(保持不變)
  • 兩個命令都被`標記(以上代字符〜)包圍以捕獲變量的命令輸出
  • 文件名彙編剝離的兩個日期對於最終文件名所需的其他格式是不必要的。
  • cat命令演示了使用產生的文件名
一種可能的方式

編碼愉快!如果您有任何問題,請留下評論。

+0

這也很好,但對於partb變量,我們需要尾部-n1而不是頭部-n5。謝謝你的幫助 – gtaware 2015-02-24 11:30:48

0

事情是這樣的:

#!/bin/sh 
LOGS="`echo mainentrywatcher_2[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].log`" 
HEAD= 
TAIL= 
for logs in $LOGS 
do 
    TAIL=`echo $logs | sed -e 's/^.*mainentrywatcher_//' -e 's/\.log$//'` 
    test -z "$HEAD" && HEAD=$TAIL 
done 
cat $LOGS >mainentrywatcherReport_${HEAD}_${TAIL}.log 
mv $LOGS archive/ 

即:

  • 在變量$日誌中獲取的現有日誌(碰巧排序)的列表
  • 穿行列表,根據示例獲得日期
  • 將第一個日期保存爲$ HEAD
  • 將最後日期a s $ TAIL
  • 循環後,將所有這些文件都轉換爲新的輸出文件
  • 將用完的日誌文件移動到歸檔目錄中。
+0

更完整腳本會檢查是否有*有任何文件。 – 2015-02-23 21:46:55

+0

嗨,謝謝,你的解決方案工作,但輸出文件的名稱是作爲mainentrywatcherReport_mainentrywatcher_2015-02-16_mainentrywatcher_2015-02-20.log,但我想要的名稱爲mainentrywatcherReport_2015-02-16_2015-02-20.log,請你建議編輯爲這個?我不想要第二個mainentrywatcher尾部變量 – gtaware 2015-02-24 10:06:31

+0

這是一個錯字 - 固定。當我檢查發現錯別字的時候,我注意到一個流浪的「^。*」,這看起來不正確,並將它「糾正」爲一個整數。這與* sed *一致。 – 2015-02-24 10:41:05

0

,如果你要爲大家介紹簡單的循環你可以試試這個...

FROM = ls -lrt mainentrywatcher_* | awk '{print $9}' | head -1 | cut -d"_" -f2 | cut -d"." -f1

TO = ls -lrt mainentrywatcher_* | awk '{print $9}' | tail -1 | cut -d"_" -f2 | cut -d"." -f1

FINAL_LOG = mainentrywatcherReport _ $ {FROM} _ $ {TO}。登錄

因爲我在ls -lrt mainentrywatcher_* | awk '{print $9}' 做 貓$ I >> $ FINAL_LOG 做

呼應

0

另一種方法給您的日常文件和測試內容爲 「在$ FINAL_LOG存儲的所有日誌」:

mainentrywatcher_2015-02-16.log -> a 
mainentrywatcher_2015-02-17.log -> b 
mainentrywatcher_2015-02-18.log -> c 
mainentrywatcher_2015-02-19.log -> d 
mainentrywatcher_2015-02-20.log -> e 

利用的bash 參數擴展/子串提取將是一個簡單的循環:

#!/bin/bash 

declare -i cnt=0        # simple counter to determine begin 
for i in mainentrywatcher_2015-02-*; do   # loop through each matching file 
    tmp=${i//*_/}        # isolate date 
    tmp=${tmp//.*/} 
    [ $cnt -eq 0 ] && begin=$tmp || end=$tmp # assign first to begin, last to end 
    ((cnt++))         # increment counter 
done 

cmbfname="${i//_*/}_${begin}_${end}.log"  # form the combined logfile name 

cat ${i//_*/}* > $cmbfname      # cat all into combined name 

## print out begin/end/cmbfname & contents to verify 
printf "\nbegin: %s\nend : %s\nfname: %s\n\n" $begin $end $cmbfname 

printf "contents: %s\n\n" $cmbfname 

cat $cmbfname 

exit 0 

使用/輸出:

alchemy:~/scr/tmp/stack/tmp> bash weekly.sh 

begin: 2015-02-16 
end : 2015-02-20 
fname: mainentrywatcher_2015-02-16_2015-02-20.log 

contents: mainentrywatcher_2015-02-16_2015-02-20.log 

a 
b 
c 
d 
e 

可以,當然,修改for loop接受含有部分文件名的位置參數和通過命令行傳遞的部分的文件名。

相關問題