Отфильтруйте большие наборы данных в даты с командной строкой

[114609]Встроенный веб-сервер

Если вашей целью является изучение PHP, я настоятельно рекомендую использовать PHP [114973], встроенный в веб-сервер[114974], доступный на PHP версии 5.4 и выше.

Теперь у вас есть веб-сервер, привязанный к директории ~/mywebsite и доступный в браузере по адресу

date --set="23 June 1988 10:00:00"
date --set="10:00:00"

Все это работает в пользовательском режиме, так что вам не нужно ничего [114975]sudo[114976].

VHost solution

Даже если вы используете метод Apache для обслуживания файлов, вы можете создать директорию типа ~/mywebsite, а затем создать [114977]VirtualHost запись[114978], указывающую на это место. Затем все файлы там могут быть отредактированы обычным образом под вашим именем пользователя. Замечание: корень VirtualHost не может использовать тильду (~), он должен быть абсолютным как [114979]/home/johndoe/mywebsite

1
09.12.2014, 00:03
2 ответа

Вы можете использовать SED , чтобы фильтровать их. Этот простой пример предполагает, что вы знаете точное время начала / конца:

sed -n '/Dec 4 14:37:36.381651/,/Dec 5 14:32:36.391572/' filename

Вы не можете окружать те временные / даты значений, которые не существуют. Например:

sed -n '/Dec 4 14:30:00.000000/,/Dec 5 14:29:59.999999/' filename

не будет работать, если указанное время не было как в журнале.


Если вы хотите фильтровать между двумя произвольными временами / датами, которые не в журнале, то AWK может помочь может помочь:

awk 'BEGIN {FS=":| +"} {current = mktime("2014 "c($1)" "$2" "$3" "$4" "$5); if (current >= mktime ("2014 12 04 14 30 0") && current <= mktime("2014 12 05 14 29 59")) {print $0 }} function c(s){return(sprintf("%02d\n",(match("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3)) }' filename

Выбранные временные / даты находятся в формате Yyyy MM DD HH MM SS Отказ Вы также отметите, что год в жестком законе, так как ваши журналы не содержат года - я предполагал, что в этом году.

Вышеуказанный одноклассник, но лучше отформатирован и с комментариями:

#!/usr/bin/awk -f
BEGIN {
    # Split line into fields using colon or spaces
    FS=":| +"
}
{
    # Generate the timestamp of the current line from the first 5 fields.
    # Use the function c(), defined below, to convert 3 letter months to numerical
    current = mktime("2014 "c($1)" "$2" "$3" "$4" "$5);
    # If the timestamp of the current line is between two specified
    # timestamps then print the whole line
    if (current >= mktime ("2014 12 08 15 0 0") && current <= mktime("2014 12 08 16 05 00")) 
        {print $0 }
}
function c(s) {
    # Function to convert three letter month to numerical
    # If s == Jan then returns 1. If s == Aug, returns 8
    return(sprintf("%02d\n",(match("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3))
}
2
27.01.2020, 23:21

Одно решение, преобразование дата в эпоху:

while read month dm hour rest; do
    d=$(date -d"$month $dm $hour" "+%m%d%H%M%S")
    echo "$d $rest"
done < file | awk '$1 < 1204143737' # print all lines before this date
2
27.01.2020, 23:21

Теги

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