#linux #bash #shell #variables #script
Вопрос:
Я хочу посчитать строки во многих файлах и многих каталогах за последние семь дней,
Имя файла выглядит следующим образом :
/home/me/DC1/server1.20211018_hours1.bz2
/home/me/DC1/server1.20211018_hours2.bz2
/home/me/DC1/server1.20211018_hours3.bz2
/home/me/DC2/server2.20211018_hours1.bz2
/home/me/DC2/server2.20211018_hours2.bz2
/home/me/DC2/server2.20211018_hours3.bz2
Таким образом, несколько файлов для одного сервера
Для того, чтобы посчитать одно имя файла, которое я сделал, работает нормально
bzcat /home/me/DC1/server1/ | wc -l
Но мне нужно перебирать каждое имя сервера, поэтому я сделал команду для вывода каждого имени файла, чтобы поместить его в var с
servername=$(find /home/me/2021/*/*server*20211015* -type f -printf "%fn" | cut -d. -f1 | sort -u)
И вот моя проблема, я хочу сделать цикл FOR, чтобы использовать свой var для подсчета каждой строки для каждого сервера за последние семь дней, и каждый раз, когда он входит в первый for, мне нужно использовать другое имя сервера в пути :p
Так что на данный момент я сделал :
servername=$(find /home/me/2021/*/*server*$dday* -type f -printf "%fn" | cut -d. -f1 | sort -u)
for file in $servername; do
for i in {1..7}; do
dday=$(date %Y%m%d -d "$i days ago")
messagefileone=0
messagefiletwo=0
messagefileone=$(bzcat /home/me/2021/*/*$servername*message1*"$dday"* | wc -l)
messagefiletwo=$(bzcat /home/me/2021/*/*$servername*message2*"$dday"* | wc -l)
total=$(($messagefileone $messagefiletwo))
echo "Nom instance: "$messagefiletwo"
echo "Day: $dday"
echo "Message messagefileone: $messagefileone"
echo "Message messagefiletwo: $messagefiletwo"
echo "Total message: $total"
done
done
Я не уверен, что мне все ясно, но я старался изо всех сил
Спасибо тебе !
Комментарии:
1.
for file in "$servername".* ; do
? Проверьте свой сценарий с помощью shellcheck2. См . раздел Использование поиска, в частности разделы Комплексные действия и Действия оптом . Запуск
anything=$(find ...)
-это антипаттерн; см. BashPitfalls #1 .