URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4714
[ Назад ]

Исходное сообщение
"diff - пропустить пару строк"

Отправлено Алдр Бов , 11-Апр-21 12:25 
Добрый день всем!

Есть текстовый файлик на пару сотен тысяч строк, в который команда периодически вносит изменения. Делается ежесуточный бэкап всего этого, но для понимания суточных изменений решили хранить отдельно суточный diff. Есть небольшая проблема - иногда изменений нет нессколько дней, но каждый день программно в начало файла вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу дифф. Курил ман, искал в гугле - не нашёл, как можно пропустить 1-2 первых строки средствами diff-а? Подскажите, кто знает, плз. Пока удаляем строку с датой. Но мне кажется, это не правильно.


Содержание

Сообщения в этом обсуждении
"diff - пропустить пару строк"
Отправлено Аноним , 11-Апр-21 13:26 
diff <(cat file1 | sed '1,2d') <(cat file2 | sed '1,2d')


"diff - пропустить пару строк"
Отправлено Алдр Бов , 11-Апр-21 17:03 
> 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.


"diff - пропустить пару строк"
Отправлено Аноним , 11-Апр-21 18:25 
убери пробелы между < и (

"diff - пропустить пару строк"
Отправлено Алдр Бов , 11-Апр-21 20:28 
> убери пробелы между < и (

в sh не помогает. Те же самые "Ambiguous input redirect." и "Missing name for redirect.". :-(


"diff - пропустить пару строк"
Отправлено ACCA , 12-Апр-21 02:49 
А 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


"diff - пропустить пару строк"
Отправлено Аноним , 12-Апр-21 00:08 
Мое решение под баш.
Я не знаю пути переписать это под чистый шелл или даже под tcsh. Может быть это и невозможно.

"diff - пропустить пару строк"
Отправлено Алдр Бов , 12-Апр-21 09:42 
> Мое решение под баш.
> Я не знаю пути переписать это под чистый шелл или даже под
> tcsh. Может быть это и невозможно.

Да нет, в юнихах почти нет слова "невозможно". Просто надо делать как-то по-другому. Вот только man diff и info diff ясности в вопрос как это - "по-другому" пока не привносят. :(


"diff - пропустить пару строк"
Отправлено Аноним , 12-Апр-21 19:35 
>надо делать как-то по-другому

Создать два временных файла, например. Но как правило в рабочей установке бсд всегда установлен баш, так что просто уберите команду в bash -c и дело с концом.


"diff - пропустить пару строк"
Отправлено Licha Morada , 11-Апр-21 22:46 
> Есть небольшая проблема - иногда
> изменений нет нессколько дней, но каждый день программно в начало файла
> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу
> дифф.

Почему же пустой по смыслу? Это железное свидетельство, что изменений не было. И весит копейки.
Хотя, может быть, для вашей задачи это не релевантно.


"diff - пропустить пару строк"
Отправлено Алдр Бов , 12-Апр-21 09:37 
>> Есть небольшая проблема - иногда
>> изменений нет несколько дней, но каждый день программно в начало файла
>> вносится дата. В результате, ежедневно ложится в хранилище пустой по смыслу
>> дифф.
> Почему же пустой по смыслу? Это железное свидетельство, что изменений не было.
> И весит копейки.
> Хотя, может быть, для вашей задачи это не релевантно.

Оно для нас особой нагрузки пока не несёт. А много мелких файлов забивают фс, и-ноды. Поэтому пока принят такой вариант решения.


"diff - пропустить пару строк"
Отправлено Ann None , 12-Апр-21 12:02 
> Добрый день всем!
> Есть текстовый файлик на пару сотен тысяч строк, в который команда периодически
> вносит изменения. Делается ежесуточный бэкап всего этого, но для понимания суточных
> изменений решили хранить отдельно суточный diff. Есть небольшая проблема - иногда
> изменений нет нессколько дней, но каждый день программно в начало файла
> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу
> дифф. Курил ман, искал в гугле - не нашёл, как можно
> пропустить 1-2 первых строки средствами diff-а? Подскажите, кто знает, плз. Пока
> удаляем строку с датой. Но мне кажется, это не правильно.

man diff:
...
       -I, --ignore-matching-lines=RE
              ignore changes where all lines match RE
...

читаю маны вслух с выражением. недорого.


"diff - пропустить пару строк"
Отправлено Алдр Бов , 12-Апр-21 13:31 
>[оверквотинг удален]
>> вносится дата. В результате, ежедневно ложится в хранилище пустой по смыслу
>> дифф. Курил ман, искал в гугле - не нашёл, как можно
>> пропустить 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 не смог.


"diff - пропустить пару строк"
Отправлено Ann None , 12-Апр-21 16:54 
> Так и я могу прочитать. И уже раз пять перечитал, и об
> эту строчку спотыкался, но придумать-подобрать RE не смог.

-I '.*04\.2021.*'

зачитывание введения в регулярные выражения уже будет дороже.


"diff - пропустить пару строк"
Отправлено Алдр Бов , 12-Апр-21 19:40 
>> Так и я могу прочитать. И уже раз пять перечитал, и об
>> эту строчку спотыкался, но придумать-подобрать RE не смог.
> -I '.*04\.2021.*'

А! Вот в каком ключе! Я не сообразил. :( Я про терминирование спецсимволов упустил, каюсь.

> зачитывание введения в регулярные выражения уже будет дороже.

Спасибо за волшебный пендель в правильную сторону!


"diff - пропустить пару строк"
Отправлено Аноним , 12-Апр-21 19:47 
В его кейсе нужно убирать дату только из первой строчки, а не из всего файла. Использование этого ключа может спрятать от диффа что-то важное, нельзя так делать.
Новичков надо поражать инженерным умом, а не умением гуглить маны (это любая макака умеет).

"diff - пропустить пару строк"
Отправлено Алдр Бов , 13-Апр-21 11:25 
> В его кейсе нужно убирать дату только из первой строчки, а не
> из всего файла. Использование этого ключа может спрятать от диффа что-то
> важное, нельзя так делать.
> Новичков надо поражать инженерным умом, а не умением гуглить маны (это любая
> макака умеет).

Не, всё нормально - я не смог сам правильно составить RE. Там не просто дата - ещё с реквизитами файла. Коллега своим примером подсказал, где я не так делал. Спасибо всем!


"diff - пропустить пару строк"
Отправлено vg , 16-Апр-21 12:03 
Использовать правильный инструмент для хранения текстогого файла, например Git, c добавлением наример git-commit-notifier, и получать сразу красиво оформленный диф по почте

"diff - пропустить пару строк"
Отправлено Алдр Бов , 16-Апр-21 17:27 
> Использовать правильный инструмент для хранения текстогого файла, например Git, c добавлением
> наример git-commit-notifier, и получать сразу красиво оформленный диф по почте

Спасибо, мы это рассматривали - до git-а мы ещё не доросли и вряд ли в ближайшей перспективе дорастём: не тот проект.


"diff - пропустить пару строк"
Отправлено vg , 16-Апр-21 22:29 
> Спасибо, мы это рассматривали - до git-а мы ещё не доросли и
> вряд ли в ближайшей перспективе дорастём: не тот проект.

Так это ... просто попробуйте, для этого сильно расти не надо. Даже тот же CVS уже больше Вам даст чем скрипт с диф. Гит просто удобнее и многие утилиты есть. И его использование не подразумевает наличие большого проэкта.

Не надо поднимать сразу Гитлаб, или репозиторй где-то. Можно git+ssh для начали, с git-commit-notifier, мы с этим жили достаточно долго даже в большом проэкте. Linux+OpenSSH+Git+Ruby+git-commit-notifier+Postfix.

Сразу появляются много плюсов как:
- можно делать изменения несколькими людми одновременно. Конфликты конечно возникают, но все решаемо
- можно сперва посмотреть изменения других, потом добавить свои
- у каждого своя копия со всей историей, и еще и дифом
- некоторые текстовые редакторы поддерживают гит из коробки (Atom например)
- и многое другое ...

Иногда походящий инструмент пугает


"diff - пропустить пару строк"
Отправлено pavlinux , 19-Апр-21 15:06 
> иногда изменений нет нессколько дней, но каждый день программно в начало файла
> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу дифф.

Приходит к тебе начальник и говорит, " - скажи когда у нас не было изменений?"
А ты, - опа,%"№"%4ъыыы*?(?%:омнономном(%;?дык,это,пррррр,вротмненоги.


"diff - пропустить пару строк"
Отправлено Licha Morada , 22-Апр-21 04:40 
>> иногда изменений нет нессколько дней, но каждый день программно в начало файла
>> вносится дата. В результате, ежедевно ложится в хранилище пустой по смыслу дифф.
> Приходит к тебе начальник и говорит, " - скажи когда у нас
> не было изменений?"
> А ты, - опа,%"№"%4ъыыы*?(?%:омнономном(%;?дык,это,пррррр,вротмненоги.

Перед такими предостережениями надо писать "Осторожно, спойлеры!".