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