Добрый день всем!Есть текстовый файлик на пару сотен тысяч строк, в который команда периодически вносит изменения. Делается ежесуточный бэкап всего этого, но для понимания суточных изменений решили хранить отдельно суточный diff. Есть небольшая проблема - иногда изменений нет нессколько дней, но каждый день программно в начало файла вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу дифф. Курил ман, искал в гугле - не нашёл, как можно пропустить 1-2 первых строки средствами diff-а? Подскажите, кто знает, плз. Пока удаляем строку с датой. Но мне кажется, это не правильно.
diff <(cat file1 | sed '1,2d') <(cat file2 | sed '1,2d')
> diff <(cat file1 | sed '1,2d') <(cat file2 | sed '1,2d')Спасибо, принцип понятен, но как-то не работает. :(
У меня FreeBSD, пробовал так:
diff -a < ( cat $file.$today | sed '1,2d' ) < ( cat $file.$yesterday | sed '1,2d' )
Missing name for redirect.
diff -a < \( cat $file.$today | sed '1,2d' \) < \( cat $file.$yesterday | sed '1,2d' \)
Ambiguous input redirect.
diff -a < \( grep -v $string $file.$today \) < \( grep -v $string $file.$yesterday \)
Ambiguous input redirect.
убери пробелы между < и (
> убери пробелы между < и (в sh не помогает. Те же самые "Ambiguous input redirect." и "Missing name for redirect.". :-(
А bash поставить вера не позволяет?В sh будет тебе пляска с бубном:
mkfifo /tmp/f1 /tmp/f2
tail -n +2 file1 > /tmp/f1&
tail -n +2 file2 > /tmp/f2&
diff /tmp/f1 /tmp/f2
wait; wait
rm /tmp/f1 /tmp/f2
Мое решение под баш.
Я не знаю пути переписать это под чистый шелл или даже под tcsh. Может быть это и невозможно.
> Мое решение под баш.
> Я не знаю пути переписать это под чистый шелл или даже под
> tcsh. Может быть это и невозможно.Да нет, в юнихах почти нет слова "невозможно". Просто надо делать как-то по-другому. Вот только man diff и info diff ясности в вопрос как это - "по-другому" пока не привносят. :(
>надо делать как-то по-другомуСоздать два временных файла, например. Но как правило в рабочей установке бсд всегда установлен баш, так что просто уберите команду в bash -c и дело с концом.
> Есть небольшая проблема - иногда
> изменений нет нессколько дней, но каждый день программно в начало файла
> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу
> дифф.Почему же пустой по смыслу? Это железное свидетельство, что изменений не было. И весит копейки.
Хотя, может быть, для вашей задачи это не релевантно.
>> Есть небольшая проблема - иногда
>> изменений нет несколько дней, но каждый день программно в начало файла
>> вносится дата. В результате, ежедневно ложится в хранилище пустой по смыслу
>> дифф.
> Почему же пустой по смыслу? Это железное свидетельство, что изменений не было.
> И весит копейки.
> Хотя, может быть, для вашей задачи это не релевантно.Оно для нас особой нагрузки пока не несёт. А много мелких файлов забивают фс, и-ноды. Поэтому пока принят такой вариант решения.
> Добрый день всем!
> Есть текстовый файлик на пару сотен тысяч строк, в который команда периодически
> вносит изменения. Делается ежесуточный бэкап всего этого, но для понимания суточных
> изменений решили хранить отдельно суточный diff. Есть небольшая проблема - иногда
> изменений нет нессколько дней, но каждый день программно в начало файла
> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу
> дифф. Курил ман, искал в гугле - не нашёл, как можно
> пропустить 1-2 первых строки средствами diff-а? Подскажите, кто знает, плз. Пока
> удаляем строку с датой. Но мне кажется, это не правильно.man diff:
...
-I, --ignore-matching-lines=RE
ignore changes where all lines match RE
...читаю маны вслух с выражением. недорого.
>[оверквотинг удален]
>> вносится дата. В результате, ежедневно ложится в хранилище пустой по смыслу
>> дифф. Курил ман, искал в гугле - не нашёл, как можно
>> пропустить 1-2 первых строки средствами diff-а? Подскажите, кто знает, плз. Пока
>> удаляем строку с датой. Но мне кажется, это не правильно.
> man diff:
> ...
> -I, --ignore-matching-lines=RE
>
> ignore changes where all lines match RE
> ...И каким тут должен быть RE? К примеру:
$ diff -a -I *04.2021* $file$today $file$yesterday
diff: extra operand `$file.$yesterday'
diff: Try `diff --help' for more information> читаю маны вслух с выражением. недорого.
Так и я могу прочитать. И уже раз пять перечитал, и об эту строчку спотыкался, но придумать-подобрать RE не смог.
> Так и я могу прочитать. И уже раз пять перечитал, и об
> эту строчку спотыкался, но придумать-подобрать RE не смог.-I '.*04\.2021.*'
зачитывание введения в регулярные выражения уже будет дороже.
>> Так и я могу прочитать. И уже раз пять перечитал, и об
>> эту строчку спотыкался, но придумать-подобрать RE не смог.
> -I '.*04\.2021.*'А! Вот в каком ключе! Я не сообразил. :( Я про терминирование спецсимволов упустил, каюсь.
> зачитывание введения в регулярные выражения уже будет дороже.
Спасибо за волшебный пендель в правильную сторону!
В его кейсе нужно убирать дату только из первой строчки, а не из всего файла. Использование этого ключа может спрятать от диффа что-то важное, нельзя так делать.
Новичков надо поражать инженерным умом, а не умением гуглить маны (это любая макака умеет).
> В его кейсе нужно убирать дату только из первой строчки, а не
> из всего файла. Использование этого ключа может спрятать от диффа что-то
> важное, нельзя так делать.
> Новичков надо поражать инженерным умом, а не умением гуглить маны (это любая
> макака умеет).Не, всё нормально - я не смог сам правильно составить RE. Там не просто дата - ещё с реквизитами файла. Коллега своим примером подсказал, где я не так делал. Спасибо всем!
Использовать правильный инструмент для хранения текстогого файла, например Git, c добавлением наример git-commit-notifier, и получать сразу красиво оформленный диф по почте
> Использовать правильный инструмент для хранения текстогого файла, например Git, c добавлением
> наример git-commit-notifier, и получать сразу красиво оформленный диф по почтеСпасибо, мы это рассматривали - до git-а мы ещё не доросли и вряд ли в ближайшей перспективе дорастём: не тот проект.
> Спасибо, мы это рассматривали - до git-а мы ещё не доросли и
> вряд ли в ближайшей перспективе дорастём: не тот проект.Так это ... просто попробуйте, для этого сильно расти не надо. Даже тот же CVS уже больше Вам даст чем скрипт с диф. Гит просто удобнее и многие утилиты есть. И его использование не подразумевает наличие большого проэкта.
Не надо поднимать сразу Гитлаб, или репозиторй где-то. Можно git+ssh для начали, с git-commit-notifier, мы с этим жили достаточно долго даже в большом проэкте. Linux+OpenSSH+Git+Ruby+git-commit-notifier+Postfix.
Сразу появляются много плюсов как:
- можно делать изменения несколькими людми одновременно. Конфликты конечно возникают, но все решаемо
- можно сперва посмотреть изменения других, потом добавить свои
- у каждого своя копия со всей историей, и еще и дифом
- некоторые текстовые редакторы поддерживают гит из коробки (Atom например)
- и многое другое ...Иногда походящий инструмент пугает
> иногда изменений нет нессколько дней, но каждый день программно в начало файла
> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу дифф.Приходит к тебе начальник и говорит, " - скажи когда у нас не было изменений?"
А ты, - опа,%"№"%4ъыыы*?(?%:омнономном(%;?дык,это,пррррр,вротмненоги.
>> иногда изменений нет нессколько дней, но каждый день программно в начало файла
>> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу дифф.
> Приходит к тебе начальник и говорит, " - скажи когда у нас
> не было изменений?"
> А ты, - опа,%"№"%4ъыыы*?(?%:омнономном(%;?дык,это,пррррр,вротмненоги.Перед такими предостережениями надо писать "Осторожно, спойлеры!".