如何将变量传递到 bash 脚本并使用 awk 单独变量?

如何将变量传递到 bash 脚本并使用 awk 单独变量?

我有一个脚本,用于清除超过 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 /blahas 来确保您实际上正在使用 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到结尾输出行。如果这有帮助,您可能会发现调试更容易。

相关内容