Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: проблема с sed, или с моим кривым bash-скриптом ?  (Прочитано 492 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн trablshuter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
  • Ubuntu Server 16.04
    • Просмотр профиля
#!/bin/bash
exec >> "/test/backup.log" 2>&1
echo "___________________________________"
echo "Start - " $(date +%d.%m.%Y-%H.%M.%S)
Loglength=10
NumString=$(cat "/test/backup.log" | wc -l)
NumKind=$(($NumString-$Loglength))
sed -i '1,'$NumKind' d;' "/test/backup.log"
echo "Stop - " $(date +%d.%m.%Y-%H.%M.%S)
этот код записан в файл script.sh
запускаю в терминале этот скрипт, он отрабатывает вроде как нужно, НО после выполнения строчки:
sed -i '1,'$NumKind' d;' "/test/backup.log"в лог уже не записывается это:
"Stop - " $(date +%d.%m.%Y-%H.%M.%S)т.е. пишу в тот же лог файл который обрабатывает SED, пробовал флаги -Q и -q, не помогает.

PS: походу ругается на одинарные кавычки, но как тогда вытащить значение переменной $NumKind внутри одинарных кавычек команды SED? Сори но в лине и в баш-скриптинге безгодунеделя :(
« Последнее редактирование: 23 Май 2016, 13:34:21 от trablshuter »

Punko

  • Гость
trablshuter, можно и без кавычек
sed -i "${NEWSTRING}i\BalancerMember http://${IP}:${NEWPORT}" ${CONF}

Оффлайн trablshuter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
  • Ubuntu Server 16.04
    • Просмотр профиля
если не сильно затруднит, объясните, пожалуйста, Вашу мысль на моём примере... а то с Вашего не получается перенять знания...  :)
Пробовал убирать и ставить уже все варианты разных кавычек, и без них тоже - в итоге ругается SED.

Сам SED просит его "аргументы" указать в одинарных кавычках - sed -i '1,$NumKind d;'
Но тогда значение $NumKind - не "извлекается".
Если после $ использовать фигурные скобки, то опять ругается SED.
« Последнее редактирование: 23 Май 2016, 11:53:32 от trablshuter »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Зачем вообще такая сложная махинация с sed и пр.?
Код: Bash
  1. echo "___________________________________
  2. Start - $(date +%d.%m.%Y-%H.%M.%S)" >> "/test/backup.log"
  3. tail -n 10 "/test/backup.log" > tmp
  4. mv tmp "/test/backup.log"
  5. echo "Stop - $(date +%d.%m.%Y-%H.%M.%S)" >> "/test/backup.log"
« Последнее редактирование: 23 Май 2016, 11:57:02 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн trablshuter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
  • Ubuntu Server 16.04
    • Просмотр профиля
Зачем вообще такая сложная махинация с sed и пр.?
Ну подкорка подсказывает:
*) в наличии уже есть файл разрешенный для редактирования, зачем создавать ещё один файл.
*) а так же, не вижу преимуществ кувыркания двух файлов на HDD (а в них может быть сотни тысяч строк, просто в примере про 10 строк написано) перед парой математических операций в скрипте.

Ну и особых преимуществ не вижу перед убиранием строки exec >> "/test/backup.log" 2>&1
Так как, например, в Вашем примере, "прицельно" не узнать об ошибках самой команды tail
С уважением.

PS: буду примного благодарен если сможете подсказать с вариантом про SED.

попробовал одинарные заменить на двойные кавычки
#!/bin/bash
exec >> "/test/backup.log" 2>&1
echo "___________________________________"
echo "Start - " $(date +%d.%m.%Y-%H.%M.%S)
Loglength=10
NumString=$(cat "/test/backup.log" | wc -l)
NumKind=$(($NumString-$Loglength))
sed -i "1, $NumKind d;" "/test/backup.log"
echo "Stop - " $(date +%d.%m.%Y-%H.%M.%S)

вроде теперь SED не ругается ни на что, и значение переменной забирается, НО... последняя строчка не пишется в файл  :-\
echo "Stop - " $(date +%d.%m.%Y-%H.%M.%S)

похоже, после редактировании файла с помощью SED, нужно заного "перенаправить" в него "выход".
...
exec >> "/test/backup.log" 2>&1
sed -i "1, $NumKind d;" "/test/backup.log"
echo "Stop - " $(date +%d.%m.%Y-%H.%M.%S)

Всем спасибо за помощь!    :)
« Последнее редактирование: 23 Май 2016, 14:43:21 от Azure »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
trablshuter, Не верьте «подкорке»! «Кувыркание с sed» точно такое же: он создает временный файл, а потом заменяет им исходный, при всём при том что tail проще и быстрее (какие ошибки Вы ожилаете от tail?). + Ваш вариант кроме арифметики читает файл 2 раза (cat + sed), а значит как минимум работает в 2 раза дольше.
Ну и особых преимуществ не вижу перед убиранием строки exec >> "/test/backup.log" 2>&1
Сами ответили
после редактировании файла с помощью SED, нужно заного "перенаправить" в него "выход".
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 14922
  • Я не слышу.
    • Просмотр профиля
exec - не умеет sed.
~.o

Оффлайн trablshuter

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
  • Ubuntu Server 16.04
    • Просмотр профиля
trablshuter, Не верьте «подкорке»! «Кувыркание с sed» точно такое же: он создает временный файл, а потом заменяет им исходный, при всём при том что tail проще и быстрее (какие ошибки Вы ожилаете от tail?). + Ваш вариант кроме арифметики читает файл 2 раза (cat + sed), а значит как минимум работает в 2 раза дольше.
вот это уже ближе к тому, чтобы я переубедился...  :D
СПС за разжовывание!

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
1. 10 строк можно сохранить в переменной.
2. "tail -n 10" - в тэйл по дефолту и так десять строк

echo "___________________________________
Start - $(date +"%x-%X")" >> "/test/backup.log"
LAST_STRINGS="$(tail "/test/backup.log")"
echo "$LAST_STRINGS" > "/test/backup.log"
echo "Stop - $(date +"%x-%X")" >> "/test/backup.log"

 

Страница сгенерирована за 0.064 секунд. Запросов: 24.