2017-06-21 46 views
-2

我有一个名为access.log的文件,它总是从服务器接收数据。所以我需要将access.log文件的数据复制到多个文件中,而不影响任何文件中的数据。例如:如果我执行脚本,需要将数据复制到另一个文件(文件名应该是access_1.log),并且access.log文件应该被截断。如果我第二次执行相同的脚本,数据应该被复制到access_2.log文件并且access.log文件应该被截断。所以如果运行该文件10次,则需要创建10个文件。 我已经尝试了下面的脚本,但是在我的代码中计数值并没有增加,所以总是会获得与access_1.log相同的文件名,并且我们也在更改数据。下面要求的shell脚本

count=1 
cp access.log access_$count.log 
>access.log 
count=`expr $count + 1` 

请帮我

+0

请问您的代码有一个循环?如果不是,“count”如何以一种有意义的方式改变? –

+0

使用称为logrotate的命令。 –

+0

我是新来的脚本。请问你可以编写完整的代码 –

回答

0

这里多少次你运行它的计数值将被保留

LOCATION=/path/to/location 
COUNT=`ls $LOCATION/access_*.log | wc -l` 

COUNT=`expr $COUNT + 1` 

cp $LOCATION/access.log $LOCATION/access_$COUNT.log 
>$LOCATION/access.log 
+0

仅供参考 - 'count = $((count + 1))'是增加计数器的更有效的方法。 (所有大写变量名称都是不好的做法;请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html,第四段)。你也在你的答案中传播了一堆引用错误。请参阅[BashFAQ#4](http://mywiki.wooledge.org/BashFAQ/004)以获得有关计数文件的最佳做法指导。 –

1

试试这个,让我知道,如果它的工作原理。

name='access' 
    if [[ -e $name.log ]] ; then 
     i=1 
     while [[ -e $name_$i.log ]] ; do 
      let i++ 
     done 
     name=$name_$i 
    fi 
    cp -r /path/to/access.log "$name".log 
    cat /dev/null > /path/to/access.log 
+0

您将以这种方式丢失数据。无论写在副本和截断之间将会丢失。 –

+0

@MarekVitek @MarekVitek如何以这种方式丢失数据,因为他已经提到他想截断access.log文件,您能否提出更好的建议,因为我认为使用脚本旋转日志时无论如何都会在副本和截断之间写入任何内容。 –

+0

因为他希望数据被移动/复制到另一个文件。但是,在复制之后和截断之前写入日志的项目不会被复制到下一个编号的日志。 –

0
FILE_LOCATION=/path/to/file/ 
FILE_DEST=/second/path/ 

for count in $(seq 1 1000) ;do 
    if [! -e ${FILE_DEST}access_${count}.log ];then 
     cp ${FILE_LOCATION}access.log ${FILE_DEST}access_${count}.log 
     exit 0 
    fi 
done 

享受

+1

尽管此代码可能会回答这个问题,但提供有关如何解决问题和/或为什么解决问题的其他上下文会提高答案的长期价值。 – Badacadabra

+0

'seq'不是bash的一部分 - 最好写(for((i = 0; i <= 1000; i ++)); do',它将只使用内置于shell本身的功能。请参阅http://shellcheck.net/,它将在此代码中标识一些引用错误。 –

0

认沽按照myprocess.conf内容

/var/log/access.log { 
     rotate 10 
     weekly 
     postrotate 
      /usr/bin/killall -HUP $myprocess 
     endscript 
    } 

然后运行logrotate的命令

logrotate --force $CONFIG_FILE 

其中$CONFIG_FILE是configurati到文件路径在你创建。 $ myprocess是写入日志的守护进程的名称。它会每周轮换登录。
请参阅/etc/logrotate.d目录以了解您的计算机上已有的配置。

如果您仍然不确定,并且想出于任何原因使用脚本,请尝试使用此脚本。

last=`ls access_* | sort -n -k 1.8 -r| head -1 | sed -e 's/access_\([0-9]*\).log/\1/'` 
((last += 1)) 
mv access.log access_${last}.log 
killall -HUP myprocess 

第一行做如下:

  • 列出所有文件开始access_
  • 那么数字排序在第1场8字符
  • 那么只需要第一行文件,人数最多
  • 然后它从字符串access_123.log提取数字