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

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

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

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
      Шпаргалка по частым синтаксическим оборотам.

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

 

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

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



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

Всего записей: 4924 | Зарегистр. 05-01-2006 | Отправлено: 16:59 27-09-2022
ndch

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
os: win 11
 
curl  "https://гибдд.рф/" -o 1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (6) Could not resolve host: гибдд.рф
 
 
однако при этом:
 
curl "https://xn--90adear.xn--p1ai/" -o 1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  311k    0  311k    0     0   263k      0 --:--:--  0:00:01 --:--:--  263k
 
Насколько вижу - проблема возникает с кириллическим именем домена (в частности).
 
curl в принципе не умеет самостоятельно работать с  кириллическим именем домена или только у меня не получается ?

Всего записей: 6477 | Зарегистр. 31-08-2008 | Отправлено: 10:10 10-10-2022 | Исправлено: ndch, 10:11 10-10-2022
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ndch
curl -V, в фичах должно быть IDN

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 10:23 10-10-2022
insorg



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

Всего записей: 15770 | Зарегистр. 04-11-2010 | Отправлено: 20:50 20-10-2022 | Исправлено: insorg, 02:26 21-10-2022
i81

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго дня!
Имеется Debian 10, на нём, по инструкции с интернета настроил уведомление в телеграм при подключении по SSH.
 

Код:
USERID="-1001555555505"
KEY="514238555:AAGeYjt955555cRrZQ5555rhc5FTCfAaINU"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
DATE_EXEC="$(date "+%d %b %Y %H:%M")"
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'
if [ -n "$SSH_CLIENT" ]; then
    IP=$(awk '{print $1}' <<< $SSH_CLIENT)
    PORT=$(awk '{print $3}' <<< $SSH_CLIENT)
    HOSTNAME=$(hostname -f)
    IPADDR=$(hostname -I | awk '{print $1}')
    curl http://ipinfo.io/$IP -s -o $TMPFILE
    CITY=$(jq -r '.city' < $TMPFILE)
    REGION=$(cat $TMPFILE | jq '.region' | sed 's/"//g')
    COUNTRY=$(cat $TMPFILE | jq '.country' | sed 's/"//g')
    ORG=$(cat $TMPFILE | jq '.org' | sed 's/"//g')
    TEXT="$DATE_EXEC: Вход пользователя ${USER} по ssh на $HOSTNAME ($IPADDR) из $IP - $ORG - $CITY, $REGION, $COUNTRY через порт $PORT"
    curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
    rm $TMPFILE
fi

 
Долгое время работало замечательно, а вот пару дней тому при каждом подключении к SSH выходит ошибка  

Код:
-bash: /tmp/ipinfo-$DATE_EXEC.txt: Нет такого файла или каталога
cat: '/tmp/ipinfo-$DATE_EXEC.txt': Нет такого файла или каталога
cat: '/tmp/ipinfo-$DATE_EXEC.txt': Нет такого файла или каталога
cat: '/tmp/ipinfo-$DATE_EXEC.txt': Нет такого файла или каталога
rm: невозможно удалить '/tmp/ipinfo-$DATE_EXEC.txt': Нет такого файла или каталога

и в уведомлении отсутвуют данные по ip.
 
Мозгами я понимаю, что проблема в создании временного файла TMPFILE из-за некорректной работы переменной DATE_EXEC="$(date "+%d %b %Y %H:%M")" но что там может быть неправильно и как это исправить я не знаю  
 
П.с. интересно, что есть практически такой же Debian 10 и там всё работает нормально.
 
Подскажите пожалуйста, люди добрые, что нужно исправить?

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 04:39 25-10-2022
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
i81
Во-первых, не надо светить ключ бота.
Во-вторых,
Цитата:
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'
апострофы надо заменить на кавычки.
В-третьих, зачем вообще нужен временный файл, когда можно всю инфу сохранить в переменных.

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 04:51 25-10-2022
i81

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

Pasha_ZZZ
Большое спасибо за оперативный ответ.
Всю логику я бездумно (и не по лени своей, а просто по неразумению предмета) перекатал с инструкции. Ключ, в предыдущем посте тоже "левый".
Изменил в файле
Код:
TMPFILE="/tmp/ipinfo-$DATE_EXEC.txt"
ошибок при подключении по ssh ещё больше
 

Код:
-bash: $TMPFILE: неоднозначное перенаправление
cat: /tmp/ipinfo-25: Нет такого файла или каталога
cat: окт: Нет такого файла или каталога
cat: 2022: Нет такого файла или каталога
cat: '06:58.txt': Нет такого файла или каталога
cat: /tmp/ipinfo-25: Нет такого файла или каталога
cat: окт: Нет такого файла или каталога
cat: 2022: Нет такого файла или каталога
cat: '06:58.txt': Нет такого файла или каталога
cat: /tmp/ipinfo-25: Нет такого файла или каталога
cat: окт: Нет такого файла или каталога
cat: 2022: Нет такого файла или каталога
cat: '06:58.txt': Нет такого файла или каталога
rm: невозможно удалить '/tmp/ipinfo-25': Нет такого файла или каталога
rm: невозможно удалить 'окт': Нет такого файла или каталога
rm: невозможно удалить '2022': Нет такого файла или каталога
rm: невозможно удалить '06:58.txt': Нет такого файла или каталога

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 05:05 25-10-2022
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
i81
Ну так понятно же, что у вас файл со всякими пробелами в имени (и прочим хламом). Везде (во всех командах) сделайте так:

Цитата:
"$TMPFILE"

А лучше измените форматы вывода даты и времени в команде date.

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 05:21 25-10-2022
i81

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

Цитата:
А лучше измените форматы вывода даты и времени в команде date.


Код:
-bash: /tmp/ipinfo-25_окт_2022_09_14.txt: Нет такого файла или каталога                                                                                                                  &#9474;································
cat: /tmp/ipinfo-25_окт_2022_09_14.txt: Нет такого файла или каталога                                                                                                                    &#9474;································
cat: /tmp/ipinfo-25_окт_2022_09_14.txt: Нет такого файла или каталога                                                                                                                    &#9474;································
cat: /tmp/ipinfo-25_окт_2022_09_14.txt: Нет такого файла или каталога                                                                                                                    &#9474;································
rm: невозможно удалить '/tmp/ipinfo-25_окт_2022_09_14.txt': Нет такого файла или каталога

 
Может какая-то проблема с записью в tmp? Хотя MC копирует фай туда нормально
 
Добавлено:
Pasha_ZZZ
убрал вообще маркер времени из имени файла

Код:
TMPFILE="/tmp/ipinfo.txt"

Всё равно ошибка

Код:
-bash: /tmp/ipinfo.txt: Нет такого файла или каталога
cat: /tmp/ipinfo.txt: Нет такого файла или каталога
cat: /tmp/ipinfo.txt: Нет такого файла или каталога
cat: /tmp/ipinfo.txt: Нет такого файла или каталога
rm: невозможно удалить '/tmp/ipinfo.txt': Нет такого файла или каталога

 
Добавлено:
изменил путь - все так же

Код:
-bash: /mnt/torrent/temp/ipinfo.txt: Нет такого файла или каталога
cat: /mnt/torrent/temp/ipinfo.txt: Нет такого файла или каталога
cat: /mnt/torrent/temp/ipinfo.txt: Нет такого файла или каталога
cat: /mnt/torrent/temp/ipinfo.txt: Нет такого файла или каталога
rm: невозможно удалить '/mnt/torrent/temp/ipinfo.txt': Нет такого файла или каталога

 
Добавлено:

Цитата:
Везде (во всех командах) сделайте так:
"$TMPFILE"
 

Вы имеете в виду добавить ковычки, к примеру тут
Код:
curl http://ipinfo.io/$IP -s -o $TMPFILE

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 07:17 25-10-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
i81
Переменные практически всегда требуют оборачивания себя в кавычки во избежании различных "раскрытий", типа glob'ов или word splitting'а.
Просто для начала возьмите за правило что $x всегда стоит писать как "$x". Ест места где кавычки можно опустить, но они не сломаются от их наличия. Ну и конечно есть примеры когда кавычки могут помешать, но это скорее надо код переписывать а не оставлять незакавыченные переменные. Увы, это некая проблема и проклятие shell'а с кавычками.
 
Писать все переменные капсом это весьма вырвиглазно(
 

Цитата:
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'
в таких конструкциях переменную стоит оборачивать в фигурные скобки, что бы точно было видно где граница имени переменной, а не помнить может ли точка идущая сразу за переменной быть частью её имени, со всеми вытекающими.
TMPFILE="/tmp/ipinfo-${DATE_EXEC}.txt"
Аналогично во всех других местах по коду, например в вызовах curl'а.
 
 

Цитата:
    IP=$(awk '{print $1}' <<< $SSH_CLIENT)
    PORT=$(awk '{print $3}' <<< $SSH_CLIENT)  
вызовы awk здесь тоже ни к чему.
read -r IP SPORT DPORT <<< "$SSH_CLIENT"  (обращу внимание что я изменил имя переменной, внимательнее при копировании примеров)
 

Цитата:
IPADDR=$(hostname -I | awk '{print $1}')
не самый надёжный способ получения ip адреса, он вернёт первый ip с первого интерфейса, что далеко не всегда то что Вы ожидаете.
 
 
 
Итак, добрались теперь до ошибок про "нет файла". Что бы увидеть ошибку нужно взглянуть на скрипт который в итоге у Вас получился после всех правок, НО давай сразу сделаем ещё одну. Зачем Вам вообще эта морока с date если это просто tmp file?..
Цитата:
DATE_EXEC="$(date "+%d %b %Y %H:%M")"
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'  
вместо вот этой канители делаем так:  TMPFILE=$(mktemp) || exit 1

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 09:33 25-10-2022 | Исправлено: Alukardd, 09:40 25-10-2022
i81

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

Цитата:
Зачем Вам вообще эта морока с date если это просто tmp file

Вообще не нужно, как видно ниже этой цитаты
Цитата:
изменил путь - все так же
в конце моего предыдущего сообщения, я вообще убрал переменную и это не помогло.
 
в итоге код у меня выглядит вот так:

Код:
DATE_EXEC="$(date "+%d_%b_%Y_%H_%M")"
TMPFILE=$(mktemp) || exit 1
if [ -n "$SSH_CLIENT" ]; then
        IP=$(awk '{print $1}' <<< $SSH_CLIENT)
        PORT=$(awk '{print $3}' <<< $SSH_CLIENT)
        HOSTNAME=$(hostname -f)
        IPADDR=$(hostname -I | awk '{print $1}')
        curl http://ipinfo.io/$IP -s -o "$TMPFILE"
        CITY=$(jq -r '.city' < "$TMPFILE")
        REGION=$(cat "$TMPFILE" | jq '.region' | sed 's/"//g')
        COUNTRY=$(cat "$TMPFILE" | jq '.country' | sed 's/"//g')
        ORG=$(cat "$TMPFILE" | jq '.org' | sed 's/"//g')
        TEXT="$DATE_EXEC: Login ${USER} по ssh на $HOSTNAME ($IPADDR) из $IP - $ORG - $CITY, $REGION, $COUNTRY через порт $PORT"
        curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
        rm "$TMPFILE"
fi
 
 
 
 

 
И работает три раза из трёх.
 
Меняю строку на
Код:
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'

тоже работает. Заключаю двойные кавычки
Код:
TMPFILE="/tmp/ipinfo-$DATE_EXEC.txt"
и опять работает.
 
Возвращаю всё как было с самого начала  
 

Код:
DATE_EXEC="$(date "+%d %b %Y %H:%M")"
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'
if [ -n "$SSH_CLIENT" ]; then
        IP=$(awk '{print $1}' <<< $SSH_CLIENT)
        PORT=$(awk '{print $3}' <<< $SSH_CLIENT)
        HOSTNAME=$(hostname -f)
        IPADDR=$(hostname -I | awk '{print $1}')
        curl http://ipinfo.io/$IP -s -o $TMPFILE
        CITY=$(jq -r '.city' < $TMPFILE)
        REGION=$(cat $TMPFILE | jq '.region' | sed 's/"//g')
        COUNTRY=$(cat $TMPFILE | jq '.country' | sed 's/"//g')
        ORG=$(cat $TMPFILE | jq '.org' | sed 's/"//g')
        TEXT="$DATE_EXEC: Login ${USER} по ssh на $HOSTNAME ($IPADDR) из $IP - $ORG - $CITY, $REGION, $COUNTRY через порт $PORT"
        curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
        rm $TMPFILE
fi
 
 
 

 
и ОПЯТЬ РАБОТАЕТ.
В общем что было - не понятно совсем

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 12:35 25-10-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
i81
В одинарных кавычках не происходит Parameter Expansion, т.е. $DATE_EXEC так и останется в имени файла.

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 13:06 25-10-2022
i81

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

Цитата:
 $DATE_EXEC так и останется в имени файла.

Ну Вы изначально верно пишите - нет разницы как этот файл называется т.к. его всё равно в конце скрипт удаляет.  
Вопрос в другом: почему не работало, а потом всё заработало  
 
Добавлено:
в итоге-то я вернул всё как было
 
Добавлено:

Цитата:
TMPFILE=$(mktemp) || exit 1

а где и с каким именем в таком случае создаётся файл?

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 13:15 25-10-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
i81
Цитата:
а где и с каким именем в таком случае создаётся файл?  
лучше всего прочитать man mktemp
Вот текущая мысль: /tmp/tmp.XXXXXXXXXX, но и путь /tmp/ и шаблон tmp.XXXXXXXXXX можно менять.
 

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

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 15:02 25-10-2022 | Исправлено: Alukardd, 15:07 25-10-2022
i81

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Про чудеса не скажу - обману, но про код точно скажу - Точно такой же, неизменный.
Как писал в самом первом сообщении: 1. Работал код долгое время. Перестал или после перезагрузки (свет выключали), или после обновления. 2. Такой же код есть ещё на двух серверах (копипастил сам) - там работает.

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 15:23 25-10-2022
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имел ли кто-либо из постояльцев этого топика опыт обработки xml из командной строки ?
Есть xml следующего вида

Цитата:
<root>
    <Table>
        <Table1>
            <Param1>Value</Param1>
        </Table1>
        <Table2>
            <Options>
                <OptionName>Option Name 1</OptionName>
                <Params>
                    <Param2>720</Param2>
                    <Param3>1280</Param3>
                </Params>
            </Options>
            <Options>
                <OptionName>Option Name 2</OptionName>
                <Params>
                    <Param2>480</Param2>
                    <Param3>640</Param3>
                </Params>
            </Options>
            <Options>
                <OptionName>Option Name 3</OptionName>
                <Params>
                    <Param2>1080</Param2>
                    <Param3>1920</Param3>
                </Params>
            </Options>
        </Table2>
    </Table>
</root>

и стоит задача извлечь из него данные в следующем в виде "OptionName|Param2", то есть после обработки данных из этого примера должна получиться табличка
 

Цитата:
 
Option Name 1|720
Option Name 2|480
Option Name 3|1080
 

 
Не могу разобраться с синтаксисом xquery-запроса в этом случае. Предпочитаю работать с xml в Xidel, но устроит решение и для любой другой аналогичной утилиты (xmlstarlet, xq, yq,...).  
Обращаю внимание что это только пример и в реальности Options может быть произвольное количество. Также в OptionName есть пробелы, я не смог составить корректный запрос в Xidel для извлечения параметра отдельной опции в этом случае.

Всего записей: 4924 | Зарегистр. 05-01-2006 | Отправлено: 16:44 26-10-2022 | Исправлено: mithridat1, 16:57 26-10-2022
Pasha_ZZZ



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

Цитата:
(xmlstarlet


Цитата:
xml sel -t -m "//root/Table/Table2/Options" -v "OptionName" -m "Params" -o "|" -v "Param2" -n testxml.xml

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 17:55 26-10-2022
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
Спасибо, вроде то что надо
С XQuery придется разбираться, но это тоже хорошее решение.

Всего записей: 4924 | Зарегистр. 05-01-2006 | Отправлено: 18:08 26-10-2022 | Исправлено: mithridat1, 18:24 26-10-2022
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, mithridat1
 
xidel -s --xpath "//Options/(OptionName || '|' || //Param2)" test.xml
xidel -s --xpath "//Options/(OptionName || '|' || .//Param2)" test.xml
xidel -s --xquery "for $opt in //Options return $opt/OptionName || '|' || $opt//Param2" test.xml
 
xidel -s --xpath "//root/Table/Table2/Options/(./OptionName || '|' || ./Params/Param2)" test.xml
xidel -s --xquery "for $opt in //root/Table/Table2/Options return concat($opt/OptionName, '|', $opt/Params/Param2)" test.xml
UPD -Прошу прощения. Для меня базовая система - Win. В *nix нужно будет заменить двойные кавычки на одинарные и наоборот.

Цитата:
Жаль что для xml нет такого же нативно понятного языка запросов как SQL

xpath, в сложных случаях xquery
Примеры проблемных xml можете привести?

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 18:27 26-10-2022 | Исправлено: Alex_Piggy, 09:34 29-10-2022
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Спасибо за вариант с Xidel ! (так и не понял до конца его документацию.)
 
Я не очень удачно выразился - конечно же XQuery это SQL для XML, но мне не удалось найти в интернете подходящие примеры для своих задач либо я давал гуглу недостаточно точные запросы.
 
Вот еще пример xml
 

Цитата:
<SettingsXml xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Detectors>
    <DetectorSettings StreamId="11111111">
      <DetectorName1 id="0">
        <Priority>Low</Priority>
      </DetectorName1>
      <StreamParams>
        <Bitrate>2000</Bitrate>
      </StreamParams>
    </DetectorSettings>
    <DetectorSettings StreamId="222222222">
      <DetectorName2 id="0">
        <Priority>High</Priority>
      </DetectorName2>
      <StreamParams>
        <Bitrate>3000</Bitrate>
      </StreamParams>
    </DetectorSettings>
    ...
    <DetectorSettings StreamId="NNNNNNNN">
      <DetectorNameN id="0">
        <Priority>Low</Priority>
      </DetectorNameN>
      <StreamParams>
        <Bitrate>2000</Bitrate>
      </StreamParams>
    </DetectorSettings>
  </Detectors>
</SettingsXml>

 
Нужно извлечь из него данные в виде
 
DetectorName1, StreamId, Bitrate
DetectorName2, StreamId, Bitrate
..
DetectorNameN, StreamId, Bitrate
 
то есть первый элемент в каждой строке это название параметра, а не его значение.

Всего записей: 4924 | Зарегистр. 05-01-2006 | Отправлено: 23:19 26-10-2022 | Исправлено: mithridat1, 23:19 26-10-2022
Открыть новую тему     Написать ответ в эту тему

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

Компьютерный форум 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