Когда Vim читает существующий файл, он пытается обнаружить кодирование файла. При выписывании файла Vim использует файл, кодирующий это, он обнаружил (кроме тех случаев, когда Вы говорите его по-другому). Так файл, обнаруженный, поскольку, UTF-8 записан как UTF-8, файл, обнаруженный, как латинский 1 записан как латинский 1 и так далее.
По умолчанию процесс обнаружения сыр. Каждый файл, который Вы открываете с Vim, как будет предполагаться, будет латинский 1, если он не обнаружит метку порядка байтов Unicode наверху. Файл UTF-8 без метки порядка байтов будет трудно отредактировать, потому что любые многобайтовые символы покажут в буфере как последовательности символов вместо отдельных символов.
Хуже, Vim, по умолчанию, использует латинский 1 для представления текста в буфере. Таким образом, файл UTF-8 с меткой порядка байтов будет поврежден понижающим преобразованием к латинскому 1.
Решение состоит в том, чтобы настроить Vim для использования UTF-8 внутренне. Это, на самом деле, рекомендуется в документации Vim и единственной причине, она не настроена, тот выход из поля состоит в том, чтобы не создавать огромный беспорядок среди пользователей, которые ожидают, что Vim будет действовать в основном в качестве латинского 1 редактора.
В Вашем .vimrc
, добавить set encoding=utf-8
и Vim перезапуска.
Или вместо этого, установите
LANG
переменная среды, чтобы указать, что UTF-8 является Вашей предпочтительной кодировкой символов. Это будет влиять не только на Vim, но и любое программное обеспечение, которое полагаетсяLANG
определить, как это должно представить текст. Например, чтобы указать, что текст должен появиться на английском языке (en
), как говорится в Соединенных Штатах (US
), закодированный как UTF-8 (utf-8
), наборLANG=en_US.utf-8
.
Теперь Vim будет использовать UTF-8 для представления текста в буфере. Плюс, это также приложит более решительное усилие для обнаружения кодировки UTF-8 в файле. Помимо поиска метки порядка байтов, это также проверит на UTF-8 без метки порядка байтов перед отступанием к латинскому 1. Таким образом, это больше не будет повреждать файл, кодированный в UTF-8, и это должно правильно отобразить символы UTF-8 во время сессии редактирования.
Для получения дополнительной информации о том, как Vim обнаруживает кодирование файла, посмотрите fileencodings
опция в документации Vim.
Для получения дополнительной информации об установке кодирования, которое Vim использует внутренне, посмотрите encoding
опция.
Если необходимо переопределить кодирование, используемое при обратной записи файла к диску посмотрите fileencoding
опция.
Что-то как
sed '1,/last date prior to chunk/d;/first date after chunk/,$d' logfile | tee cut-log | less
tee cut-log
позволяет Вам видеть на экране, что помещается в файл cut-log
.
Править:
Для удовлетворения обременительных стандартов fred.bear вот, sed решение (хотя возможно awk решение намного более симпатично):
b=BB; e=EE ;echo -e "AA\nAA\nBB\nBB\nCC\nCC\nDD\nDD\nEE\nEE\nFF\nFF" | sed -n ":b;/$b/b p;n;b b;:p;p;n;/$e/b e;b p;:e;p;n;/$e/b e;q"
Для печати всего между НЕЧТО и ПАНЕЛЬЮ включительно попробуйте:
$ sed -n '/FOO/,/BAR/p' file.txt
Это сделает то, что Вы хотите...
И Включая и, Исключая даты параметра показаны.
# set Test args
set 2011-02-24 2011-02-26 "junk"
from="$1"
till="$2"
file="$3"
# EITHER ==== +++++++++
# Ouptut lines between two parameter dates INCLUDING the parameter dates
awk -v from=$from -v till=$till '
($2 >= from) && ($2 <= till) { print $0 ; next }
($2 > till) { exit }' "$file"
# OR ======== ---------
# Ouptut lines between two parameter dates EXCLUDING the parameter dates
awk -v from=$from -v till=$till '
($2 > from) && ($2 < till) { print $0 ; next }
($2 >= till) { exit }' "$file"
Это тестирует на (отсортированную) дату в поле 2... Вот является пример fo данными тестирования
98 2011-02-05 xxxx
99 2011-02-05 xxxx
100 2011-02-06 xxxx
101 2011-02-06 xxxx
awk -v from="$from" -v till="$till" '($2 >= from) { if ($2 <= till) { print } else { exit }' "$file"
– asoundmove
28.02.2011, 23:17
if
оператор всего (даже 1 на строку) т.е. логический поток является эффективно тем же, и различие во время выполнения считалось бы в наносекундах.... Единственная причина, которую я не использовал "еще", состоит в том, что это - эффективно мое самое первое awk
сценарий (кроме одного дня 4 года назад, когда я играл с некоторыми примерами)... и это - первый осуществимый механизм ответвления, который я нашел... (и, как упомянуто. это столь же быстро).. Я использование generly sed
Попробовать q
– Peter.O
01.03.2011, 04:37
Если в Вашем файле журнала у Вас есть даты в этом формате YYYY-MM-DD
, затем, для нахождения всех записей для говорят, 10.02.2011, можно сделать:
grep 2011-02-10 log_file
Теперь, скажем, если Вы хотите найти записи на 10.02.2011 и 11.02.2011, затем, снова использование grep
но с несколькими шаблонами:
grep -E '2011-02-10|2011-02-11' log_file
grep
будет искать весь файл, даже если диапазон дат будет в начале файла. В среднем это удваивает время поиска, по сравнению с "exit-after-last-item-in-range"... Я только потрудился упоминать это из-за размера файла на 8 ГБ, упомянутого в вопросе, Ваши grep результаты времени почти идентичны sed примеру здесь (1 минута 58 секунд). Вот ссылка на мои тестовые результаты времени: paste.ubuntu.com/573477
– Peter.O
28.02.2011, 18:57
Работа с этим размером файлов всегда трудна.
Путь вперед мог состоять в том, чтобы разделить этот файл на пару маленьких, чтобы сделать это можно использовать команду разделения.
split -d -l 50000 ToBigFile.data file_
Даже Вы, это разделено, можно все еще работать с файлом как то, если был бы тот с помощью удара для цикла
for f in `ls file_*`; do cat $f; done;
Но вместо кошки можно использовать инвертированный grep для избавлений от нежелательных данных, которые не важны для этого. (или вид улучшения, в котором Вы нуждаетесь).
В этой точке Вы будете просто работать с большим количеством меньших файлов, и команды, другие упомянутые выше будут работать, задыхаются на большом количестве меньших файлов.
И когда Вы сделаны, можно использовать секунду для цикла для создания нового меньшего файла снова.
for f in `ls file_*`; do cat $f >> NewFile.data ; done;
Обновление, Так как мы начинаем разделять данные в нескольких файлах, там будет большой работой с жестким диском, и это занимает время. (В этом вопросе, по-видимому, 5 минут).
С другой стороны, следующие шаги, вероятно, были бы быстрее.
Таким образом, этот метод, вероятно, бессмыслен для простого grep, awk, sed операция, но если шаблоны поиска становятся более сложными, это могло бы стать быстрее.
perl -wlne '/^2011-02-24/ .. /^2011-02-25/ and print' log_file
sed
может соответствоватьawk
для скорости, и это было на самом деле немного быстрее. – Peter.O 01.03.2011, 15:13