将所有文件附加到unix中的单个文件,并使用第一个和最后一个文件名的一部分重命名输出文件

时间:2015-02-23 18:05:38

标签: linux shell unix

例如,我在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/

有人可以帮忙解决如何将输出文件重命名为以上格式的问题吗?

4 个答案:

答案 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/

那是:

  • 在变量$ LOGS
  • 中获取现有日志(恰好已排序)的列表
  • 浏览列表,根据示例获取日期
  • 将第一个日期保存为$ HEAD
  • 将上次日期保存为$ TAIL
  • 循环后,将所有这些文件cat到新的输出文件中
  • 将已用完的日志文件移动到存档目录中。

答案 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}
  • 问题中描述了“ls -l”输出
  • “head -nX”取输出的第X行
  • “cut -d'_'-f2”获取第一个下划线后的所有内容(仍为)
  • “cut -d”。' -f1“在第一个时期之前计算所有(剩下的)
  • 两个命令都被`标记(在波浪号〜上方)包围,以将命令的输出捕获到变量
  • 文件名使用最终文件名所需的其他格式组合剥离了不必要的两个日期。
  • cat命令演示了一种使用生成的文件名的可能方法

快乐的编码!如果您有任何问题,请发表评论。

答案 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以接受包含部分文件名的位置参数,并从命令行传递部分文件名。