bash: Продолжительность между двумя временными метками больше часа?

Формат каталога полностью зависит от файловой системы.

Как минимум запись каталога должна содержать имя файла и номер индексного дескриптора.

Чтобы использовать файловую систему Linux ext4 (и более ранние версии) в качестве примера, исходная запись каталога имела номер инода (4 байта), длину имени файла (2 байта) и общая длина записи (2 байта), а также само имя файла. (IIRC общая длина указывается явно, чтобы допустить заполнение и т. д.)

Текущие версии (от ext3 ) также поддерживают хранилище древовидного типа, что позволяет быстрее искать каталоги с большим количеством файлов. , но конечно имеет более сложный формат.

Хотя на ext4 размер каталога отображается только как кратный размеру блока, т.е. пустой каталог имеет размер 4096 и не увеличивается до тех пор, пока не будет достаточно файлы создаются так, чтобы требовать выделения для них нового блока данных.

RHEL 7 использует XFS в качестве файловой системы по умолчанию, поэтому вы можете использовать именно ее. XFS имеет несколько форматов каталогов, а краткая форма, используемая для небольших каталогов, имеет, по сути, тот же минимальный набор из номера инода + имени файла + длины имени файла + общей длины.

1
05.01.2017, 00:24
2 ответа

Исходя из предположения о входных данных ниже, я написал этот код.

передать входной файл в качестве аргумента для сценария

входной файл

$ cat input
2017-01-03T00:00:15.529596-03:00 session-enter TEST1
......
.......
......
2017-01-03T00:00:37.529596-03:00 session-exit TEST1
.....
.....
2017-01-03T00:00:18.529596-03:00 session-enter TEST2
......
.......
......
2017-01-03T00:03:20.529596-03:00 session-exit TEST2
...........
..........
2017-01-03T00:00:18.529596-03:00 session-enter TEST3
......
.......
......
2017-01-03T02:03:20.529596-03:00 session-exit TEST3

extract.sh

#!/bin/bash

SESSION_LOG_FILE=${1}
SESSION_EXTRACT_FILE=/tmp/$$.txt

awk '/enter/{sname=$NF;start=$1;}/exit/ && $0~sname{end=$1;}start && end{print sname,start,end;start="";end="";}' "${SESSION_LOG_FILE}" > ${SESSION_EXTRACT_FILE}

while read SESSION_NAME SESSION_START SESSION_END
do
        echo "---------${SESSION_NAME}---------"
        echo "Start Time : ${SESSION_START}"
        echo "End   Time : ${SESSION_END}"
        START_EPOCH=${SESSION_START%-*}
        START_EPOCH=$(date -d "${START_EPOCH}" +%s)
        END_EPOCH=${SESSION_END%-*}
        END_EPOCH=$(date -d "${END_EPOCH}" +%s)
        DIFFERENCE=$((${END_EPOCH}-${START_EPOCH}))
        echo "DIFFERENCE in seconds : ${DIFFERENCE}"
done < "${SESSION_EXTRACT_FILE}"

output

$ ./extract.sh input
---------TEST1---------
Start Time : 2017-01-03T00:00:15.529596-03:00
End   Time : 2017-01-03T00:00:37.529596-03:00
DIFFERENCE in seconds : 22
---------TEST2---------
Start Time : 2017-01-03T00:00:18.529596-03:00
End   Time : 2017-01-03T00:03:20.529596-03:00
DIFFERENCE in seconds : 182
---------TEST3---------
Start Time : 2017-01-03T00:00:18.529596-03:00
End   Time : 2017-01-03T02:03:20.529596-03:00
DIFFERENCE in seconds : 7382

проверить, если время в секундах больше 3600

#!/bin/bash

SESSION_LOG_FILE=${1}
SESSION_EXTRACT_FILE=/tmp/$$.txt

awk '/enter/{sname=$NF;start=$1;}/exit/ && $0~sname{end=$1;}start && end{print sname,start,end;start="";end="";}' "${SESSION_LOG_FILE}" > ${SESSION_EXTRACT_FILE}

while read SESSION_NAME SESSION_START SESSION_END
do
        START_EPOCH=${SESSION_START%-*}
        START_EPOCH=$(date -d "${START_EPOCH}" +%s)
        END_EPOCH=${SESSION_END%-*}
        END_EPOCH=$(date -d "${END_EPOCH}" +%s)
        DIFFERENCE=$((${END_EPOCH}-${START_EPOCH}))
        if [ "${DIFFERENCE}" -gt "3600" ]
                then
                        echo "---------${SESSION_NAME}---------"
                        echo "Start Time : ${SESSION_START}"
                        echo "End   Time : ${SESSION_END}"
                        echo "DIFFERENCE in seconds : ${DIFFERENCE}"
                fi
done < "${SESSION_EXTRACT_FILE}"
0
28.01.2020, 01:04

Похоже, у вас уже есть время начала и время окончания, сохраненные в секундах с начала эпохи. Если это правда, вы сможете сделать:

duration=$(( $epochEnd - $epochStart ))
[ $duration -gt 3600 ] && echo "Duration: $duration"
0
28.01.2020, 01:04

Теги

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