Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
неа, а вот я сижу в zsh, поэтому даже и не впалил тему
 
Rasmys
просто используйте в shell'е всегда echo

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 10:47 15-04-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
скорее всего --line-buffered -- это gnu-расширение. если у вас стоит gnu-bash, то может стоять и gnu-grep (да и другие утилиты тоже). попробуйте их найти, они, если я верно помню, устанавливаются отдельным пакетом куда-то в /opt.
без --line-buffered grep может буферизировать вывод, и вы получите результат не вовремя.
либо посмотрите какие похожие опции есть у родного grep.
либо городить вызовы grep на каждую принятную строку из логов.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 13:21 15-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Объясните, плиз, что происходит в этой строке:
 
grep text | sed -e "s/<[^>]*>//g"

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 10:57 30-04-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Maximus777
Конкретно это - не знаю. Оно работает? выглядит как html-escaped версия  
grep txt | sed -e "s/<[^>]*>//g"
Убирает все html-теги (все что между угловыми скобками, включая сами скобки). PCRE вариант -  
grep txt | ssed -R -e "s/<.*?>//g"

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 11:15 30-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, Alex_Piggy.
Я догадываюсь (очень издалека), что вторая часть выражения просто удаляет лишний текст. В исходной строке это выглядит так:
 
<h3 class="typeM">Нужный_текст</h3>
 
После обработки остаётся только Нужный_текст. Хотелось бы осознать весь процесс этого колдунства. Для общего развития, так сказать
 
Хотя, моя конечная цель немного отличается, т.к. исходная строка более объёмная. Мне надо выхватить текст между bla-bla-bla"> и следующей <

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 11:26 30-04-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maximus777
"вторая часть выражения просто удаляет лишний текст." - неправильно. Удаляет найденный текст.
Объяснить, наверное, у меня не получится. Если в строке может быть только одно совпадение, то  "Строку целиком заменить на содержимое первых скобок."
grep txt | sed -r -e "s/^.*bla-bla-bla\x22>([^<]*)<.*$/\1/i"

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 22:36 30-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Благодарю за помощь. Начинаю понимать sed

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:27 30-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется такой код:

Код:
awk 'BEGIN {f=0}; /day date=\"2014-05-03\"/ {f=0}; f {print}; /day date=\"2014-05-02\"/ {f=1}'

То есть, выхватываем текст между двумя датами. Возможно ли заменить даты на команды:
date +%F и date --date="${date} 1 days" +"%F"

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 13:53 02-05-2014 | Исправлено: Maximus777, 13:54 02-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
date +%F' ' | tr -d "\n"; date -d "1 day" +"%F"

выдаёт:
2014-05-02 2014-05-03
 

Код:
date +%F' ' | tr -d "\n"; date -d "1 day" +"%F" | awk '{ print $2 }'

2014-05-02
Пуркуа?!
 
Upd:
Здесь понял. Блин! Как вывести две даты в строку, чтоб вторая была на день позже?
 
Upd2:
Победил.

Код:
echo `date +%F` `date -d "1 day" +"%F"` | awk '{print $2}'

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 19:14 02-05-2014 | Исправлено: Maximus777, 19:50 02-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Позвольте, а на кой хер выводить две даты и тут же одну отфильтровывать через awk?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 20:54 02-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Вопрос скорее должен звучать "почему", а не "зачем". Таковы мои познания, пока.
 
Мне надо в эту строку:

Код:
awk 'BEGIN {f=0}; /day date=\"2014-05-03\"/ {f=0}; f {print}; /day date=\"2014-05-02\"/ {f=1}'

подставить дату, которая будет вычисляться. Вот я и стал изобретать велосипед ... Т.е. отфильтровывание одной даты, это просто тренировка, чтобы понять, как оно работает.
 
А полностью, задача такая. Есть xml файл, в нём 10 разделов, типа:
<day date="2014-05-02">
...
<day date="2014-05-03">
...
и т.д. Нужен однострочник, который вытащит из раздела некоторую инфу. Даты, само собой, будут меняться.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:35 02-05-2014 | Исправлено: Maximus777, 23:37 02-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Maximus777
1. Если это xml, зачем Вам вторая дата? Должен быть закрывающий тег </date>.
2. Использовать переменные awk -v "MyDate1=$(date +%F)"  -v "MyDate2=$(date -d '1 day' +%F)"  '{print MyDate1 FS FS MyDate2}'

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 14:23 03-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Забавно, что-то мне ни когда в голову не приходило прямо в print передавать переменную FS
А с другой стороны зачем? Когда можно просто написать print MyDate1,MyDate2

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 17:11 03-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравия желаю!
Alex_Piggy
 

Цитата:
1. Если это xml, зачем Вам вторая дата? Должен быть закрывающий тег </date>.

Есть некий файл-скрипт, состоящий из нескольких строк, примерно такого формата:
var1 = "sed ... awk ... и прочая"
var2 = "grep ... sed ..."
Таких строк 10. Файл xml, который парсится, тоже имеет 10 разделов, с 10-ю датами, от сегодняшней, до +9 дней. На основе этого xml и заполняется первый файл с переменными var1 - var10.
 
Alex_Piggy

Цитата:
2. Использовать переменные awk -v "MyDate1=$(date +%F)"  -v "MyDate2=$(date -d '1 day' +%F)"

Похоже то, что надо. Даже print не нужен. Т.к. задача awk'а только выхватить кусок из файла, находящийся между этими двумя датами. А далее | sed ... , срезать лишнее которым я уже научился
 
Спасибо за ответы, на возможно глупые вопросы.
 
Вот, что у меня в итоге получилось:

Код:
awk "BEGIN {f=0}; /day date=\"$(date +%F)\"/ {f=0}; f {print}; /day date=\"$(date -d '1 days' +%F)\"/ {f=1}"

Блин! Как просто оказалось в итоге!

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:51 03-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Цитата:
А далее | sed ..
Уважаемый, awk и сам прекрасно может отрезать всё лишнее, зачем вызывать после одного мощнейшего парсера ещё и второй?
 
А смысл Вашего конечного выражения вообще туманен, получается Вы выводите все строки после того как нашли строку содержащую "завтра" и до того как наткнётесь на "сегодня".

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 23:17 03-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maximus777
1. Я имел в виду, что в xml каждый тег должен закрываться. То есть у Вас данные за день начинаются с <day date="2014-05-02"> и должны заканчиватся просто </day>. print был просто для для демонстрации дат.  '$0 ~ MyDate1 {...}; $0 ~ MyDate2 {....}'
2. И у sed и у awk есть выбор обрабатываемого диапазона (когда указываются два регекспа через запятую). Попробуйте
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/p"
Убираете -n и вместо p в фигурных скобках - набор команд для обработки...

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 23:46 03-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd

Цитата:
Уважаемый, awk и сам прекрасно может отрезать всё лишнее, зачем вызывать после одного мощнейшего парсера ещё и второй?

Делаю по подобию оригинального файла. Возможно, что его создавал такой же начинающий парсерщик, как и я. Можете сами посмотреть, если используете KDE. Это погодный виджет, пакет plasma-widget-cwp.
 

Цитата:
А смысл Вашего конечного выражения вообще туманен, получается Вы выводите все строки после того как нашли строку содержащую "завтра" и до того как наткнётесь на "сегодня".

Опять же, я просто нашёл пример, который вырезает кусок текста и приспособил его под свои нужды. Когда я пытался делать это sed'ом, то в вырезанном куске было много лишнего. С awk вырезание проходит без таких фокусов, но его синтаксис для меня более сложен.
 
Alex_Piggy

Цитата:
1. Я имел в виду, что в xml каждый тег должен закрываться.

В принципе, да. Можно и так.
 

Цитата:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/p"

Так работает. Но дальше опять грабли. Из полученного куска надо выхватить другой текст, между тегами <temperature_to> и </temperature_to>. Так не получилось:

Код:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/p" filesrc | sed -n -e "/<temperature\_to>/,/<\/temperature\_to>/p"

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 19:03 04-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Maximus777
Прошу прощения, а зачем Вы подстрочное тире экранируете? Я не знаю такого... Может в этом причина? Посмотрите так:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/{/<temperature_to>/,/<\/temperature_to>/p}"

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 19:27 04-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Цитата:
Прошу прощения, а зачем Вы подстрочное тире экранируете?

Это я извиняюсь. Просто уже начал перебирать варианты и один из последних запостил. Сначала без экранирования пробовал.
 

Цитата:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/{/<temperature_to>/,/<\/temperature_to>/p}"

Нет, не получается. Может проблема в том, что в этом куске текста несколько тегов по температуре?

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:04 04-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maximus777
Нет. Должно вывести все. Можно образец?

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 21:07 04-05-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru