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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422, во-первых:
 

 
Во-вторых, то, что привели — не есть корректный XML.  Полагаю, что все-таки на самом деле он выглядит так:
 
<?xml version="1.0" encoding="UTF-8" ?>
<Folder name="">
  <Folder name="Folder1">
    <Clip>
      <Attr name="bps">16</Attr>
      <Attr name="channels">2</Attr>
      <Attr name="title">name12345</Attr>
    </Clip>
  </Folder>
  <Folder name="Folder2">
    <Clip>
      <Attr name="bps">16</Attr>
      <Attr name="channels">2</Attr>
      <Attr name="title">12345name</Attr>
    </Clip>
  </Folder>
</Folder>

 
Иначе — я не понимаю, откуда вы его взяли.
 
Во-вторых, этот ваш костыль выводит дословно следующее:
$ cat file.xml  |gawk -F "<Attr name=\"title\">" {'print $2'}  
 
 
 
 
 
 
name12345</Attr>
 
 
 
 
 
 
12345name</Attr>
 

 
Это точно то, что вам нужно?  Если нет, а на самом деле вам надо извлечь значение title из-под такого-то Folder, то за вас уже все давно написали:
 
$ xmlstarlet sel -t -m '/Folder/Folder[@name="Folder1"]/Clip/Attr[@name="title"]' -v 'node()' -n file.xml
name12345

 
 
Добавлено:
Да, а если нужно выбрать не одно, а все значения, и привести их в удобный для текстового разбора вид, то соответственно как-то так:
 
$ xmlstarlet sel -t -m '/Folder/Folder' -v '@name' -o ',' -v 'Clip/Attr[@name="title"]' -n file.xml
Folder1,name12345
Folder2,12345name


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:32 06-05-2016 | Исправлено: ASE_DAG, 19:41 06-05-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Первый вариант с xmlstarlet делает то, что нужно, благодарю. В приведенном варианте с gawk в рабочем варианте были еще 2 команды, убрать пробелы и концовку, так что он тоже рабочий, если надо вывести все данные из таблицы.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 21:32 06-05-2016 | Исправлено: digital422, 21:36 06-05-2016
Damiurgent

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А вот вам весьма нетривиальная задачка:
Необходимо в текстовом файле удалить между двумя паттернами все символы hex(0A), он же \n , он же символ начала/конца строки.
Можно perl.

Всего записей: 15 | Зарегистр. 25-08-2006 | Отправлено: 17:42 13-05-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Damiurgent> А вот вам
 
Нам надо сказать «спасибо»?
 
> весьма нетривиальная задачка
 
ORLY?  Чего тут такого «нетривиального»?
 
> Необходимо в текстовом файле удалить между двумя паттернами все символы hex(0A), он же \n , он же символ начала/конца строки.  
 
$ awk '/foo/ { isInRange = 1 }; /bar/ { isInRange = 0 }; isInRange { printf "%s", $0 }; !isInRange'
 
 
И да, \n — это ни в коем случае не символ начала строки.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:02 13-05-2016
Damiurgent

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
СПАСИБО!
Только оно не работает.
Сделал разные патерны, заработало.

Всего записей: 15 | Зарегистр. 25-08-2006 | Отправлено: 18:20 13-05-2016 | Исправлено: Damiurgent, 18:33 13-05-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Damiurgent> Только оно не работает.
 
УМВР.
 
> Сделал разные патерны, заработало.
 
Вы хотите сказать, что изначально шаблонов было не два, как вы сказали, а один, то есть от foo до foo?  Ну это, разумеется, тоже несложно сделать, однако задачу надо сразу ставить корректно.
 
$ awk '/foo/ { patternCounter++ }; patternCounter % 2 == 1 { printf "%s", $0 }; patternCounter % 2 == 0'

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:53 13-05-2016 | Исправлено: ASE_DAG, 18:53 13-05-2016
dev2null



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Чёто никак не разберусь, как в zsh 5.2 отключить эту "фичу": http://s1.bild.me/bilder/240416/65645302016-05-16-074951_1920x1080_scrot.png
До этого пользовался zsh (где-то с 4-й версии до 5.1.1) в Lubuntu - там такого не было, а сейчас перешёл на Арч с zsh 5.2 - такое безобразие (в bash не наблюдается, только в zsh).

Всего записей: 574 | Зарегистр. 23-10-2011 | Отправлено: 08:15 16-05-2016
makarei



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста насчет следующего скрипта. Идея в том, что a=b, но видимо переменные обрабатываются здесь по разному и равенства не получается.
 
Подскажите пожалуйста как исправить. Спасибо!
 

Код:
#!/bin/bash
 
a=$(curl -sI http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2 | grep Last-Modified)
b="Last-Modified: Fri, 04 Dec 2015 13:23:47 GMT"
 
if [ "$a" != "$b" ]
then
  echo "$a dose not equal $b."
fi
 
exit 0
 

Всего записей: 1127 | Зарегистр. 27-03-2007 | Отправлено: 20:11 02-06-2016
CrownRU



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

Цитата:
Подскажите пожалуйста насчет следующего скрипта. Идея в том, что a=b, но видимо переменные обрабатываются здесь по разному и равенства не получается.
 
Подскажите пожалуйста как исправить. Спасибо!  

 
Похоже curl пихает в string что-то еще. Попробуйте так:
 

Код:
 
#!/bin/bash  
 
a=$(wget --server-response --spider http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2 2>&1 | grep Last-Modi)
b="  Last-Modified: Fri, 04 Dec 2015 13:23:47 GMT"
 
if [ "$a" != "$b" ]
then
  echo "$a dose not equal $b."
fi
exit 0
 
 
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:51 03-06-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
makarei
CrownRU
Наверное правильней убрать "Last-Modified:", преобразовать дату/время в удобоваримый вид, тем же time т.е. date, а потом сравнивать.

Всего записей: 12815 | Зарегистр. 11-03-2002 | Отправлено: 11:05 03-06-2016 | Исправлено: Pasha_ZZZ, 11:06 03-06-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А цель-то какая? Если проверять файл на дату обновления, то можно использовать что-то типа:
 

Код:
curl --header "If-Modified-Since: Fri, 04 Dec 2015 13:23:47 GMT" -v "http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2" >/dev/null  

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:12 03-06-2016
makarei



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Pasha_ZZZ
Благодарю за ответы и код!
 
Код ниже делает все гораздо проще, чем предпологалось делать проверку на изменение даты ранее
 

Код:
curl --header "If-Modified-Since: Fri, 04 Dec 2015 13:23:47 GMT" -v "http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2" >/dev/null


Всего записей: 1127 | Зарегистр. 27-03-2007 | Отправлено: 11:31 03-06-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, вы, безусловно, совершенно верно подсказали, что можно и нужно переложить сравнение дат на сервер, однако на всякий случай сообщу, в чем же тут было дело: HTTP использует т. н. «досовские» переводы строк — \r\n, и curl(1) их — напротив — не приводит к \n:
 

$ curl -sI http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2 \
| grep 'Last-Modified' |  od -t x1z
0000000 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64 3a 20 46  >Last-Modified: F<
0000020 72 69 2c 20 30 34 20 44 65 63 20 32 30 31 35 20  >ri, 04 Dec 2015 <
0000040 31 33 3a 32 33 3a 34 37 20 47 4d 54 0d 0a        >13:23:47 GMT..<
0000056

 
Соответственно сверять их можно как-то так:
 

a=$(curl -sI http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2 | grep Last-Modified)
b=$'Last-Modified: Fri, 04 Dec 2015 13:23:47 GMT\r'
 
if [[ $a != $b ]]
...

 
makarei> http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2
 
А это, надеюсь, только для примера ссылка была, да?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:56 03-06-2016 | Исправлено: ASE_DAG, 12:05 03-06-2016
makarei



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Благодарю за ваше обьяснение
 
Верно, что сслыка на GCC—для примера.

Всего записей: 1127 | Зарегистр. 27-03-2007 | Отправлено: 12:22 03-06-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Воистину Так я и предполагал.

Код:
#!/bin/bash
 
a=$(curl -sI http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2 | grep Last-Modified)
echo $a | cat -v
b="Last-Modified: Fri, 04 Dec 2015 13:23:47 GMT"
echo $b | cat -v
if [ "$a" != "$b" ]
then
  echo "$a dose not equal $b."
fi
exit 0

 
и что мы видим на выходе?
 

Код:
Last-Modified: Fri, 04 Dec 2015 13:23:47 GMT^M
Last-Modified: Fri, 04 Dec 2015 13:23:47 GMT
 

Ну, мотаем на ус.
 
Можно еще вот так побороть проблему
 

Код:
a=$(curl -sI http://mirrors-usa.go-parts.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2 | grep Last-Modified| sed 's/\r//')

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:01 03-06-2016 | Исправлено: CrownRU, 13:18 03-06-2016
1karavan1

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

Всего записей: 382 | Зарегистр. 20-11-2015 | Отправлено: 16:17 11-06-2016 | Исправлено: 1karavan1, 23:20 16-06-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1karavan1
Вы подробно описываете НЕ рабочее решение, а о рабочем только обмолвились, что оно найдено. Вы или пост свой стирайте или приводите также и решение.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 08:14 13-06-2016
1karavan1

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Т.к. тема узкоспециализированная, то решение никому, кроме меня, полезности не несет. Удалил.

Всего записей: 382 | Зарегистр. 20-11-2015 | Отправлено: 21:53 19-06-2016 | Исправлено: 1karavan1, 21:57 19-06-2016
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго.
ОС FreeBSD9.2
выполнить команду, если при пинговании хоста проходит не 100% пакетов.
 

Код:
 
syslog:~# sh ./pt.sh 10.10.0.1
22
syslog:~# cat ./pt.sh
ping -c 2 $1 | grep transmitted | /usr/bin/awk '{ print $1$4}'
syslog:~#
 

 
вывод: отправленные принятые.  
Но оформить это с if не получается.

Код:
 
if [ping -c 2 $1 | grep transmitted | /usr/bin/awk '{ print $1$4}' eq 22]; then
echo "mycommand0"
else  
echo "mycommand1"
fi
 

 
не догоняю, как результат awk передать в if. Через файл не хочется.
 
Помогите, пожалуйста, правильным кодом.

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 09:58 22-06-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1karavan1> решение никому, кроме меня, полезности не несет. Удалил.
 
Ну-ну.
 
 
dvk54> if [ping -c 2 $1 | grep transmitted | /usr/bin/awk '{ print $1$4}' eq 22]; then
 
В целом настоятельно рекомендую хотя бы немного поучить язык, прежде чем начинать на что-то писать.  :-)  Это вообще непонятно какой синтаксис.
 
> выполнить команду, если при пинговании хоста проходит не 100% пакетов
 
if ping -c "$c" "$host" \
        | awk -v c="$c" \
              '$3 == "transmitted," && c == $1 && $1 == $4 { success = 1 }
               END { if (!success) exit 3 }'
then
    echo 'OK'
else
    echo 'FAIL'
fi

 
Не проверял.


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:02 22-06-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 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