
Имеется файл, в котором записи в первом и втором полях содержат дату и время следующим образом: 2015/10/14 00:33:37
.
Файл содержит более 100 000 строк и постоянно обновляется. Записи в файле должны быть выбраны с самого раннего понедельника 00:00:00 по воскресенье 23:59:59.
2015/10/11 23:55:37 abc1 def1 2015/10/11 23:55:39 abc2 def2 2015/10/11 23:56:19 abc3 def3 2015/10/11 23:56:46 abc4 def4 2015/10/11 23:57:46 abc5 def5 2015/10/12 0:04:25 abc6 def6 2015/10/12 0:04:44 abc7 def7 2015/10/12 0:04:44 abc8 def8 2015/10/12 0:04:44 abc9 def9 2015/10/12 0:04:44 abc10 def10 2015/10/12 0:04:44 abc11 def11 2015/10/12 0:04:44 abc12 def12 2015/10/12 0:04:44 abc13 def13 2015/10/12 0:04:44 abc14 def14 2015/10/12 0:04:44 abc15 def15 2015/10/12 0:04:48 abc16 def16 2015/10/12 0:04:48 abc17 def17 2015/10/12 0:04:48 abc18 def18 2015/10/12 0:04:48 abc19 def19 2015/10/12 0:04:49 abc20 def20 2015/10/12 0:04:49 abc21 def21 2015/10/12 0:08:36 abc22 def22 2015/10/12 0:08:36 abc23 def23 2015/10/12 0:08:36 abc24 def24 2015/10/12 0:08:36 abc25 def25 2015/10/12 0:08:36 abc26 def26 2015/10/12 0:08:36 abc27 def27 2015/10/12 0:08:36 abc28 def28 2015/10/12 0:08:37 abc29 def29 2015/10/12 0:08:37 abc30 def30
решение1
Этот фрагмент скрипта оболочки создает расширенное регулярное выражение (с /
надлежащим образом экранированными символами), которое содержит все дни с последнего понедельника по следующее воскресенье в YYYY/MM/DD
формате. Затем он использует его grep
для поиска в файле журнала.
DAYS=$(for D in {0..6} ; do
date -d "last monday + $D days" +'%Y\\/%m\\/%d'
done | xargs |
sed -e 's/ /|/g'
)
REGEX="^($DAYS) "
grep -E "$REGEX" logfile.txt
Если вы предпочитаете использовать базовые регулярные выражения, измените последние несколько строк на:
REGEX="^\($DAYS\) "
REGEX=$(printf "%s" "$REGEX" | sed -e 's/\([|]\)/\\\1/g')
grep "$REGEX" logfile.txt
Другой вариант — использовать grep
параметры -F
(фиксированная строка) и -f
(файл) с возможностью подстановки процессов в оболочке <( ... )
, например так:
DAYS=$(for D in {0..6} ; do
date -d "last monday + $D days" +'%Y/%m/%d'
done )
grep -F -f <(echo "$DAYS") logfile.txt
или даже
grep -F -f <( for D in {0..6} ; do
date -d "last monday + $D days" +'%Y/%m/%d'
done ) logfile.txt
ПРИМЕЧАНИЕ: последние две версии будут совпадать по дате в этом формате в любом месте строки, а не только в начале строки. С приведенным вами примером это вряд ли станет проблемой.