如何删除文件每X次脚本运行 - 从脚本内部管理日志文件?

时间:2016-11-01 18:32:15

标签: linux bash awk sed grep

我通常只是将它作为一个cron作业或脚本安排,但是,我想删除一个日志文件(它经常在每次脚本运行时附加),仅在50次之后。

脚本内部需要:

问题是,由于脚本不能一致地运行,因此必须在脚本本身内实现。 请注意:出于各种原因,我需要在脚本中使用它。

我在尝试什么:

我正在考虑将变量设置为递增,将其输出到文件,然后让脚本每次都读取该文件。然后,如果该值大于X,则删除该文件。该部分代码将是grepawk语句。

任何人都知道一个简单,更好的方法吗?您的积极意见得到高度赞赏。

4 个答案:

答案 0 :(得分:2)

您可以使用xattr将任意元数据与文件相关联,如下所示:

touch a.txt                # Create file
xattr -w runs 1 a.txt      # Set run count to 1
xattr -p runs a.txt        # Print run count
1

xattr -w runs 49 a.txt     # Change value
xattr -l a.txt             # List all attributes
runs: 49

它的美妙之处在于它不会出现在grep中或者使用普通工具查看文件时。

请注意,并非所有文件系统(例如Microsoft FAT)都支持xattr

答案 1 :(得分:2)

自Gnu awk v.4.1以来,就地编辑已经可用 (参见awk save modifications in place)所以,您可以将计数器存储到您的awk脚本变量中,并使用awk脚本编辑自身并减少计数器变量,如下所示:

$ cat program.awk
BEGIN {
    this=5                                  # the counter variable
}
/this=[0-9]+/ {                             # if counter (this=5) matches
    if(this==0)                             # if counter is down to 0...
        ;                                   # ... do what you need to do
    split($0,a,"=")                         # split "this=5" by the "="
    sub(/=[0-9]+$/,"=" (a[2]==0?5:a[2]-1))  # decrement it or if 0 set to 5 again
}
1                                           # print

运行它:

$ awk -i inplace -f program.awk program.awk
$ head -3 program.awk
BEGIN {
    this=4                                  # the counter variable
}

基本上你运行program.awk会更改program.awk内的一条记录,一旦计数器达到0,if就会被执行。

答案 2 :(得分:1)

在下面的代码中使用sed,每次时,脚本中的x都会增加1 >脚本运行,最多50,然后将x设置回1。您可以设置命令以处理else 语句if分支中的日志文件以及其他代码你想在每个分支中运行。

#!/bin/bash

x=1
y=$((x+1))
z=1

if [ $x -lt 50 ]; then
    # Do something...

    sed -i -e "s/x=$x/x=$y/" "$0"
else
    # Do something...
    # Delete logfile...

    sed -i -e "s/x=$x/x=$z/" "$0"
fi

在这里,我运行脚本以显示x增加并在50次运行后重置为1

$ cat testscript
#!/bin/bash

x=1
y=$((x+1))
z=1

if [ $x -lt 50 ]; then
    # Do something...

    sed -i -e "s/x=$x/x=$y/" "$0"
else
    # Do something...
    # Delete logfile...

    sed -i -e "s/x=$x/x=$z/" "$0"
fi
$ ./testscript
$ cat testscript
#!/bin/bash

x=2
y=$((x+1))
z=1

if [ $x -lt 50 ]; then
    # Do something...

    sed -i -e "s/x=$x/x=$y/" "$0"
else
    # Do something...
    # Delete logfile...

    sed -i -e "s/x=$x/x=$z/" "$0"
fi
$

正如您所看到的,x=1已成为脚本中的x=2

我现在手动将x=2设置为x=50并保存脚本以显示其重置为x=1

$ cat testscript
#!/bin/bash

x=50
y=$((x+1))
z=1

if [ $x -lt 50 ]; then
    # Do something...

    sed -i -e "s/x=$x/x=$y/" "$0"
else
    # Do something...
    # Delete logfile...

    sed -i -e "s/x=$x/x=$z/" "$0"
fi
$ ./testscript
$ cat testscript
#!/bin/bash

x=1
y=$((x+1))
z=1

if [ $x -lt 50 ]; then
    # Do something...

    sed -i -e "s/x=$x/x=$y/" "$0"
else
    # Do something...
    # Delete logfile...

    sed -i -e "s/x=$x/x=$z/" "$0"
fi
$ 

答案 3 :(得分:0)

如上所述,我的主要要求是在脚本内进行或内联。正如@EvansWinner所提到的,我可以使用文件大小或年龄等属性来管理文件。但是,我使用的行数更加简单。

SetByteArrayRegion(env, byteArray, from, size, a + from);

因此,我不必担心它运行了多少次。希望对于那些试图在脚本中每隔x次删除一个文件的人来说,这将有助于您查看文件属性以及如何使用大小,年龄或我使用的行数管理它们。这些解决方案比创建其他系统所需的程序或包更加便携。