我有一个脚本,用于清除超过 X 天的日志文件的所有行。X 可以通过命令行以及日志文件名传递,例如用法:
./purge-catalina.sh 3 /opt/tomcat8/logs/catalina.out
脚本本身如下所示:
date_pattern=$(date -d "-$1 day" '+%Y-%m-%d')
catalina_file="$2"
echo "Purging all logs older than $date_pattern"
#grep -v "$pattern" $2 > catalina.out.temp; mv catalina.out.temp $2
awk -v d="$date_pattern" '($1 " " $2) > d' $catalina_file
当我将变量传递给脚本,然后像上面一样运行 awk 命令时,awk 部分似乎无法获取正确的行。但是,如果我不将任何变量传递给脚本并将变量硬编码为:
date_pattern=$(date -d "-3 day" '+%Y-%m-%d')
catalina_file="logfile.log"
运行正常。我怎样才能将变量传递给脚本并在 awk 脚本中使用 $1 和 $2?
答案1
您的脚本对我而言正如预期的那样工作。
您应该真正执行使用bash script.sh 3 /blah
as 来确保您实际上正在使用 bash;您可能会发现您实际上正在使用 dash 或类似的东西,尽管您所写的是正确的 sh。
$ ./script.sh 3 /opt/comca
Purging all logs older than 2018-04-24
awk -v d="2018-04-24" '($1 " " $2) > d' /opt/comca
$ cat script.sh
date_pattern=$(date -d "-$1 day" '+%Y-%m-%d')
catalina_file="$2"
echo "Purging all logs older than $date_pattern"
#grep -v "$pattern" $2 > catalina.out.temp; mv catalina.out.temp $2
echo "awk -v d=\"$date_pattern\" '(\$1 \" \" \$2) > d' $catalina_file"
您有想过更简单的事情吗?
sed -ne "/^$date_pattern/,\$p" "$catalina_file"
将从第一次出现$date_pattern
到结尾输出行。如果这有帮助,您可能会发现调试更容易。