.
не является переменным со значением. Это (специальный) файл в файловой системе. Вы не можете изменить это.
Используйте wc -l
дважды и вычтите результаты.
before=$(wc -l < yourfile)
sleep 60
after=$(wc -l < yourfile)
let dif=after-before
echo "$dif"
Вы также можете просто вывести последние $ dif
строки:
tail -n$dif yourfile
Хотя за это время можно было добавить больше строк, ни одна из операций здесь не является атомарной.
Если вы хотите отслеживать инкрементные изменения (по крайней мере, количество добавленных строк), просто записывайте вывод команды wc -l
каждую минуту. Однако нет возможности сделать это, не зная заранее, что вам это понадобится.Если у вас нет временных меток в каждой строке, вы не сможете узнать, какая часть файла была добавлена и когда.
Это мое окончательное решение:
#!/bin/bash
for i in *access_log; do
(
before=$(wc -l < $i)
sleep 10
after=$(wc -l < $i)
let dif=after-before
echo "$i: $dif"
) &
done
{
tail -c 1 > /dev/null
sleep 60
wc -l
} < your-file
С ksh93
:
{ sleep 60; wc -l; } < your-file <#((EOF))
Это открывает файл, ищет до конца (в первом чтении и отбрасывании одного байта), затем засыпает 60 секунд, а затем вызывает wc - l
для подсчета количества символов новой строки между позицией, в которой мы находились 1 минуту назад, и (новым) концом файла (если оно больше).
Обратите внимание, что он читает только тот раздел, который был добавлен в течение этих 60 секунд. Если файл был полностью переписан, при этом не будет учтено возможное изменение количества символов новой строки в исходной части файла.
Кроме того, он проверяет изменения в исходном файле, даже если этот файл был удален и / или файл с тем же именем был воссоздан или связан с каталогом, из которого файл был открыт изначально.
Если вы хотите узнать, с какой скоростью строки добавляются в файл журнала, другой вариант - использовать pv -l
с tail -f
:
for f in *access_log; do
tail -fn0 -- "$f" | pv -cN "$f" -ral > /dev/null &
done
wait
-ra
для текущей и средней ставки. -l
, поэтому скорость выражается в количестве строк в секунду.