Как передать переменную в скрипт bash и использовать отдельные переменные с awk?

У меня есть скрипт, который я использую, чтобы очистить все строки файлов журнала старше X дней. X может быть передан через командную строку, а также имя файла журнала, ex use:

./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"

Работает нормально. Как передать переменные в скрипт, а также использовать $1 и $2 в скрипте awk?

1 ответ

Ваш сценарий работает, как и ожидалось для меня.

Вы должны действительно выполнить с помощью bash script.sh 3 /blah поскольку это гарантирует, что вы на самом деле используете Bash; вы можете обнаружить, что вы на самом деле используете тире или что-то подобное, хотя написанное вами правильно.

$ ./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 к концу. Отладка может оказаться проще, если это поможет.

Другие вопросы по тегам