У меня есть сценарий, который я использую для очистки всех строк из файлов журнала старше 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?
Ваш скрипт у меня работает так, как ожидалось.
Вам действительно стоит выполнять его, используя 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
до конца. Если это поможет, вам будет проще отладка.