Как передать переменную в сценарий 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"

Все работает нормально. Как я могу передать переменные в сценарий, а также использовать $ 1 и $ 2 в сценарии awk?

-1
задан 26 April 2018 в 20:18
1 ответ

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

Вам действительно стоит выполнять его, используя bash script.sh 3 / blah , поскольку это гарантирует, что вы действительно используете bash; вы можете обнаружить, что на самом деле используете тире или что-то подобное, хотя то, что вы написали, правильно. 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 до конца. Если это поможет, вам будет проще отладка.

1
ответ дан 5 December 2019 в 19:40

Теги

Похожие вопросы