Выходная строка рассчитывает для файлов с разностью имени файла в 1 число - PullRequest
0 голосов
/ 26 апреля 2019

У нас есть требование сообщать о количестве строк, записанных в 7-дневный цикл файлов журнала.Файлы журнала называются - [filename].log.1.gz на сегодня, [filename].log.2.gz на вчерашний день до [filename].log.7.gz на 7-й день

Я надеялся создать скрипт, который бы выводил числа сразу, вместо того, чтобы запускатькоманда zcat [filename].log.1.gz | wc -l против каждой строки.Я также надеялся получить осмысленное сообщение для каждого выведенного значения

Я могу написать сценарий bash, который будет выполнять каждую строку, поскольку имена файлов совпадают, но я надеялся на что-то более элегантное

Вместо этого

zcat position.log.3.gz | wc -l
zcat position.log.4.gz | wc -l
zcat position.log.5.gz | wc -l
zcat position.log.6.gz | wc -l
zcat position.log.7.gz | wc -l

Я надеялся на что-то более подобное

for i in {1..7}
c=$(zcat position.log.$i.gz | wc -l)
message=$"The count for "
date1=$(date --date='$i days ago')
result=$"$message$date1$c"
echo $result
done 

Однако я не могу заставить это работать.

Есть идеи?

1 Ответ

0 голосов
/ 26 апреля 2019

Вы сценарий с небольшими исправлениями:

# for loop starts with a 'do'
for i in {1..7}; do
   # indentation makes everything redable
   # always quote your variables
   c=$(zcat "position.log.$i.gz" | wc -l)
   # The "" is just a string, no '$' sign before it
   message="The count for "
   # The '$i' is literally `$i`, if you want to _expand_ a variable, you have to use "$i"
   date1=$(date --date="$i days ago")
   # same as above, drop the $
   result="$message$date1$c"
   # always quote your variables
   echo "$result"
done 

Или, может быть, немного короче:

for i in {1..7}; do
   echo "The count for $(date --date="$i days ago") is $(zcat "position.log.$i.gz" | wc -l)"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...