例如,我在2015年2月16日到20日之间有以下日志文件。现在我想创建一个名为mainentrywatcherReport_2015-02-16_2015-02-20.log
的文件。换句话说,我想从周的第一个和最后一个文件(周一至周五)中提取日期格式,并在每个星期六创建一个输出文件。我将每周六使用cron触发脚本。
$ 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 :(得分: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/
那是:
答案 1 :(得分: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}
快乐的编码!如果您有任何问题,请发表评论。
答案 2 :(得分:0)
如果你想引入简单的循环,你可以试试这个......
这= ls -lrt mainentrywatcher_* | awk '{print $9}' | head -1 | cut -d"_" -f2 | cut -d"." -f1
要= ls -lrt mainentrywatcher_* | awk '{print $9}' | tail -1 | cut -d"_" -f2 | cut -d"." -f1
FINAL_LOG = mainentrywatcherReport _ $ {FROM} _ $ {TO}的.log
for ls -lrt mainentrywatcher_* | awk '{print $9}'
做
cat $ i>> $ FINAL_LOG
完成
echo"存储在$ FINAL_LOG"
中的所有日志答案 3 :(得分:0)
给出日常文件和测试内容的另一种方法如下:
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
以接受包含部分文件名的位置参数,并从命令行传递部分文件名。