У меня есть файл журнала 8 Гб (журнал производства Rails). Мне нужно сократить это между некоторыми датами (линиями). Какую команду я могу использовать для этого?
text-processing
logs
Эрик Лещинский
источник
источник
sed
сделаем это легко.Ответы:
Что-то вроде
tee cut-log
позволяет увидеть на экране, что помещается в файлcut-log
.РЕДАКТИРОВАТЬ:
Чтобы удовлетворить строгие стандарты fred.bear, вот решение sed (хотя, возможно, решение awk намного красивее):
источник
sed
может соответствоватьawk
скорости, и это было на самом деле немного быстрее.Чтобы распечатать все между FOO и BAR включительно, попробуйте:
источник
Это будет делать то, что вы хотите ...
Отображаются как включающие, так и исключающие даты параметров.
Он проверяет (отсортированную) дату в поле 2 ... Вот пример тестовых данных
А вот и генератор тестовых данных .
источник
awk -v from="$from" -v till="$till" '($2 >= from) { if ($2 <= till) { print } else { exit }' "$file"
if
оператор в общей сложности (даже не 1 на строку), т.е. логический поток фактически такой же, и разница во времени выполнения будет подсчитываться в наносекундах .... Единственная причина, по которой я не использовал "else", заключается в том, что это фактически мой первыйawk
сценарий (за исключением одного дня 4 года). назад, когда я играл с некоторыми примерами) ... и это первый работающий механизм ветвления, который я нашел ... (и, как уже упоминалось, он так же быстр) .. Я обычно используюsed
Tryq
Если в вашем файле журнала у вас есть даты в этом формате
YYYY-MM-DD
, то, чтобы найти все записи, скажем, 2011-02-10, вы можете сделать:Теперь, скажем, если вы хотите найти записи для 2011-02-10 и 2011-02-11, то снова используйте,
grep
но с несколькими шаблонами:источник
grep
будет искать весь файл, даже если диапазон дат находится в начале файла. В среднем это удваивает время поиска, по сравнению с «exit-after-last-item-in-range» ... Я только затрудняюсь упомянуть это из-за размера файла 8 ГБ, упомянутого в вопросе, Ваш Результаты grep time практически идентичны приведенному здесь примеру sed (1 мин 58 с). Вот ссылка на мои результаты тестов времени: paste.ubuntu.com/573477Работать с файлами такого размера всегда сложно.
Путь вперед может состоять в том, чтобы разбить этот файл на пару маленьких, для этого вы можете использовать команду split.
Даже если он разделен, вы все равно можете работать с файлом, как если бы он использовал цикл bash for
Но вместо кошки вы можете использовать инвертированный grep, чтобы избавиться от нежелательных данных, что для этого не имеет значения. (или вид уточнения, который вам нужен).
На этом этапе вы будете просто работать с большим количеством файлов меньшего размера, а команды, упомянутые выше, будут работать с большим количеством файлов меньшего размера.
И когда вы закончите, вы можете использовать второй цикл for, чтобы снова создать новый файл меньшего размера.
Обновление Поскольку мы начинаем разделять данные на несколько файлов, с жестким диском будет много работы, и это займет время. (В этом вопросе видимо 5мин).
С другой стороны, следующие шаги, вероятно, будут быстрее.
Так что этот метод, вероятно, не имеет смысла для простых операций grep, awk, sed, но если шаблоны поиска станут более сложными, они могут стать быстрее.
источник
источник