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

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

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, mithridat1
В первую очередь смотрите правила и выражения XPath например https://www.w3schools.com/xml/xpath_intro.asp (и далее), список функций, доступный в xidel https://www.benibela.de/documentation/internettools/xpath-functions.html
Полное имя ноды вида DetectorNameN неизвестно (выбрав ноду, его можно получить стандартной функцией local-name() ), поэтому вместо него ставим * (любая нода). В условиях (квадратных скобках) более точно определяем подходящие варианты:
1. Это первая нода внутри DetectorSettings: //DetectorSettings/*[1]
2. Это нода, имя которой начинается с DetectorName: //DetectorSettings/*[starts-with(local-name(),'DetectorName')]
3. Это нода, которая содержит аттрибут id и ноду Priority. //DetectorSettings/*[@id and Priority]
Третий вариант мне кажется самым подходщим. И получаем XPath такого вида
//DetectorSettings/concat(*[@id and Priority]/local-name(), ',', @StreamId, ',', StreamParams/Bitrate)
Этот XPath может быть использован практически с любым xml софтом.
xidel --xpath "//DetectorSettings/concat(*[@id and Priority]/local-name(), ',', @StreamId, ',', StreamParams/Bitrate)" test2.xml
XQuery - основное, это ключевые слова FLOWR (for, let, order, where, return) - https://www.w3schools.com/xml/xquery_flwor.asp Для работы с деревом нод используется тот же XPath.

Код:
 
for $DetSet in //DetectorSettings
  let $DetName:=$DetSet/*[@id and Priority]/local-name()
  return concat($DetName, ',', $DetSet/@StreamId, ',', $DetSet/StreamParams/Bitrate)
 

xidel --xquery "for $DetSet in //DetectorSettings let $DetName:=$DetSet/*[@id and Priority]/local-name()   return concat($DetName, ',', $DetSet/@StreamId, ',', $DetSet/StreamParams/Bitrate)" test2.xml

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Спасибо за такое подробное объяснение
 
Забыл уточнить, название ноды DetectorNameN может быть произвольным, известно только что в конце обязательно присутствует слово Detector и эта нода должна идти первой по порядку. Также есть примерный список возможных имен DetectorNameN. Как можно использовать эту информацию в запросе ?

Всего записей: 5025 | Зарегистр. 05-01-2006 | Отправлено: 10:23 27-10-2022
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
К сожалению пропал свет.
Первая нода и содержит Detector  
*[1][contains(local-name(),'Detector')]
Как использовать список в XPath - не знаю. Поищу, подумаю.
UPD:
XPath 1.0 - поиск внутри строки с разделителями, запрещенными в имени. Например @.
*[contains('FlameIonizationDetector@TermoConductivityDetector',local-name())]
  UPD - Чтобы не реагировал на фрагменты слов ('lame'), наверное даже лучше так:
  *[contains('@FlameIonizationDetector@TermoConductivityDetector@','@'||local-name()||'@')]
XPath 2.0 поддерживает перечисление
*[local-name()=('FlameIonizationDetector','TermoConductivityDetector')]
Но я бы использовал список как "или". Потому что он будет проверять точное совпадение ('FlameIonizationDetector1' - уже не отреагирует). Например, "Нода содержит аттрибут @id, ноду Priority и ее имя или содержит 'Detector' или представленно в списке ('FID','TCD','ECD','FTD')"
*[(@id and Priority) and (contains(local-name(),'Detector') or local-name()=('FID','TCD','ECD','FTD'))]
Идеальный вариант - если для этого xml есть комплектный xsd (набор правил для валидации), где можно посмотреть возможные варианты (является ли обязательным тот же аттрибут @id. Если нет - то его нельзя использовать при поиске).

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 10:48 27-10-2022 | Исправлено: Alex_Piggy, 12:01 27-10-2022
mithridat1



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Спасибо за информацию !
 
Возник еще один вопрос по xpath-запросам. Из первого примера мне надо извлечь значение Param2 там где значение OptionName='Option Name 1'. Делаю так
 
xidel -s --xpath "//root/Table/Table2/Options[@OptionName='Option Name 1']/Params/Param2" TestXml.xml
 
но запрос ничего не возвращает.
Так тоже ничего
 
xidel -s --xpath "//root/Table/Table2/Options[OptionName='Option Name 1']/Params/Param2" TestXml.xml
 
В чем ошибка ?

Всего записей: 5025 | Зарегистр. 05-01-2006 | Отправлено: 22:35 28-10-2022
Alex_Piggy

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

Цитата:
@OptionName='Option Name 1'

Options/@OptionName - это атрибут "OptionName" ноды Options. В первом примере аттрибутов нет совсем, во втором у ноды DetectorSettings есть аттрибут @StreamId.

Цитата:
xidel -s --xpath "//root/Table/Table2/Options[OptionName='Option Name 1']/Params/Param2" TestXml.xml

Это правильный вариант и у меня на Вашем примере он работает на версиях xidel 20210606.7886 и 20220424.8389. Тест-пакет для win https://www.upload.ee/files/14622232/test2.zip.html  . Ответ - "720".
Какую версию xidel в какой системе Вы используете?  
Ничего не выводит на примере или на реальном файле? Попробуйте добавить ключ "--xml" --input-format=xml для реального файла (xidel вроде согласно правилам html5 преобразует /table/tr /table/tbody/tr).  
PS. Прошу прощения, в прошлом посте допустил неточность относительно "в конце". Если заканчивается на слово и после нет никаких символов - то это функция ends-with(), а не contains().
UPD Не "--xml", а "--input-format=xml". --xml и вывод тоже организует в xml.
Может ли быть проблема с кодировками?

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 23:38 28-10-2022 | Исправлено: Alex_Piggy, 23:43 28-10-2022
mithridat1



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Да, действительно, второй вариант работает, это у меня локально в xml несоответствие было.
 
Хочу обратить внимание что для этого же примера вариант запроса

Цитата:
xidel -s --xpath "//Options/(OptionName || '|' || //Param2)" test.xml

у вас некорректный, поскольку возвращает во втором столбце всегда значение первого по списку Param2.

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

Вот так работает
 
xidel -s --xpath "//Options/(OptionName || '|' || Params/Param2)" test.xml

Всего записей: 5025 | Зарегистр. 05-01-2006 | Отправлено: 05:53 29-10-2022 | Исправлено: mithridat1, 06:06 29-10-2022
Alex_Piggy

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

Цитата:

Цитата:
xidel -s --xpath "//Options/(OptionName || '|' || //Param2)" test.xml

у вас некорректный, поскольку возвращает во втором столбце всегда значение первого по списку Param2.

Спасибо. Должна быть точка перед //Param2.
xidel -s --xpath "//Options/(OptionName || '|' || .//Param2)" test.xml
"//" - это быстрая запись для запроса по оси "descendant-or-self" - "/descendant-or-self::*/" - нода с любым уровнем вложенности, включая текущую.
"//Param2" будет искать ноду Param2 от рута.
".//Param2" будет искать ноду Param2 от текущей ноды (//Options/).

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 09:33 29-10-2022
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Небольшая задача по обработке файлов.
Есть файлы с камеры, собираются в одну папку (1 камера), скрипт делает парсинг по имени, выделяет дату и время, создает папки (mkdir не стал включать в код) и раскидывает их по нужным. Как эту часть скрипта объединить с циклом for, чтобы за один проход происходила сортировка всех накопленных файлов, а не поштучно. И можно ли что ни нибудь поправить, или сделать парсинг-сортировку по другому ?
20221104_20-47-43_2047285100.jpg - Пример файла.

Код:
 
A1="$($FIND $DIR_CAM2 -maxdepth 1 -type f -name "*.jpg" -printf %f | awk '{split($1,a,"-"); print a[1]}')"
 
SPLIT_DATE="$(echo $A1 | awk '{split($1,a,"_"); print a[1]}')"
SPLIT_HOUR="$(echo $A1 | awk -F"_" '{split($2,a,"-");  print a[1]}')"
 
$FIND $DIR_CAM2 -maxdepth 1 -type f -name "${SPLIT_DATE}_${SPLIT_HOUR}*.jpg" \
-exec mv {} $DIR_CAM2/${SPLIT_DATE}/${SPLIT_HOUR} \;
 

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 19:30 04-11-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Код:
#!/bin/bash
 
DIR_CAM2='/tmp/test'
 
while IFS=$'\1 ' read -r -d '' file name; do
    date=${name%%_*}
    hour=${name#*-}; hour=${hour%%-*}
    mkdir -p "$DIR_CAM2/$date/$hour"
    mv "$file" "$DIR_CAM2/$date/$hour/"
done < <(find "$DIR_CAM2" -maxdepth 1 -type f -name '*.jpg' -printf '%p\1%f\0')
p.s. подправил слегка. извратился и поддержал \n и пробелы внутри имени файла, хотя по Вашему шаблону их там быть не должно, но почему бы не защититься, если это не сложно. Понятно что дальше можно облагораживать вырезание даты и времени, с учётом возможных пробелов, например, но это уже по мере извращения))
Я собственно показал извращение с NULL байтом и \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.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 14:07 06-11-2022 | Исправлено: Alukardd, 14:30 06-11-2022
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Спасибо, никак не могу проверить. Надо будет доделать с месяцем и годом, т.к. работающий сейчас скрипт размещает папку последнего дня месяца в наступивший месяц.
 
Вопрос, надо обрабатывать текстовые строки через массив, надоело для каждой писать свои правила. Хочу сделать логи, что срабатывает на каждой строке, для этого надо прописать второй аргумент. Аналогичный скрипт работает, но там в строках нет пробелов. Что надо исправить чтобы работали $1 и $2 при включении 2 или 3 переменной TEXT?
 

Код:
 
#!/bin/bash
 
TEXT1="SASL CRAM-MD5 authentication failed: authentication failure"
TEXT2="non-SMTP command"
 
text1_var=${TEXT1##*/}
text2_var=${TEXT2##*/}
 
TEXT=("01 TEXT01" "02 TEXT02")
#TEXT=("01 ${TEXT1}" "02 TEXT02")
#TEXT=("01 $text1_var" "02 $text1_var")
 
for i in "${TEXT[@]}" ; do
    set $i
    echo "run: $2 log: $1"
done
 

 
P.S. Сделал вариант с разделителем: ("01, TEXT01") и затем разделять через gawk: echo $i | $GAWK -F, '{print $2}'

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 16:42 21-11-2022 | Исправлено: digital422, 21:00 21-11-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Про новый скрипт и все вот эти TEXT ни чего не понял. Опишите задачу словами.

----------
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 22-11-2022
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TEXT - для примера, первая строка работает, а вот 2-я, в которой есть пробел как раз делится разделителем пробел на отдельные слова. Но как дописал вчера, через gawk делю строку на 2 части и дальше по аналогии с $1 $2. На первом TEXT надо закомментировать, а на втором наоборот - и будет видна проблема.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 17:10 22-11-2022 | Исправлено: digital422, 19:42 22-11-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
а-а-а
Как сложна, опять не понял что происходит.
Описывать надо не "я думал", а задачу сначала, типа вот данные, вот такой результат надо получить, а Вы...
 
Потратив ещё пару минут, вчитывась и по частям собирая инфу полагаю, что суть в том что бы отедлить первое слово и всё остальное? И надо что-то такого: read -r run log <<<"$i"
Дальше используем где надо $run и $log

----------
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 | Отправлено: 18:29 22-11-2022 | Исправлено: Alukardd, 18:29 22-11-2022
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Да, спасибо, этого и не хватало )
read -r run log <<<"$i"
 
01 _ SASL CRAM-MD5 authentication failed: authentication failure
02 _ non-SMTP command
 
это тоже работает, только надо разделитель дописывать в аргументах log:
log=$(echo $i | $GAWK -F, '{print $1}')
run=$(echo $i | $GAWK -F, '{print $2}')

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 19:30 22-11-2022 | Исправлено: digital422, 19:32 22-11-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Вызывать внешнюю утилиту, да ещё и несколько раз, это прям не очень.
Всегда по возможности используйте сначала встроенные возможности shell'а. Во-первых, это часто быстрее, потому что fork+exec штука дорогая. Во-вторых, это лишние зависимости.
Да иногда, особенно для больших данных имеет смысл вызывать внешнюю утилиту, даже если можно обойтись без неё. Но это уже только с опытом может прийти, да и тогда часто нужно тыкаться и делать замеры под каждую ситуацию.
 
p.s. ну и учимся формулировать задачу правильно

----------
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 | Отправлено: 00:39 23-11-2022 | Исправлено: Alukardd, 02:16 23-11-2022
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача: вывести из таблицы маршрутизации адрес (сеть) и шлюз, через который происходит маршрутизация.
Вариант: ip r | grep "$address" | gawk '{print $3}' работает со статичной таблицей, но если есть динамика, то на месте $3 появляется 48, выбор столбца-неверное решение.
 
Примет статики и динамики:
192.168.231.211 via 10.231.10.1 dev tap0
192.168.222.22 nhid 48 via 10.222.4.1 dev tap1 proto ospf metric 20
 
на выходе должно быть:
192.168.231.211 10.231.10.1
192.168.222.22 10.222.4.1
 
Сделал один вариант, может есть еще решения?
ip=$(ip r | grep "$address" | gawk '{print $1}')
gw=$(ip r | grep "$address" | grep -Po '(?<=via )(\d{1,3}.){4}')
echo "$ip $gw"

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 12:30 28-11-2022
MAGNet



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

Цитата:
Сделал один вариант, может есть еще решения?


Код:
ip r | grep $address | sed 's!\([0-9./]\+\).* via \([0-9.]\+\) .*!\1 \2!'

 
Объяснение:
grep - отфильтровывает только нужные нам строки;
 
sed:
- в первых скобках (они экранируются) сохраняет совпадение номер один по шаблону "от начала строки все цифры, точки и слэши" до первого несоответствующего символа, чтоб под шаблон попали, как ip-адреса, так и ip-адреса с маской. у меня в выводе маска присутствует)
- далее во вторых скобках сохраняется ip-адрес, который идёт сразу за последовательностью любых символов, заканчивающихся комбинацией " via", сразу за ним должен следовать пробел и после любая последовательность любых символов.  
- если полученная строка соответствует такому шаблону, то она будет заменена на то, что сохранится в первых и вторых скобках.
 
пример:

Код:
192.168.231.211 via 10.231.10.1 dev tap0
192.168.222.22 nhid 48 via 10.222.4.1 dev tap1 proto ospf metric 20
192.168.231.211/24 via 10.231.10.1 dev tap0
192.168.222.22/24 nhid 48 via 10.222.4.1 dev tap1 proto ospf metric 20

 
вывод:

Код:
192.168.231.211 10.231.10.1
192.168.222.22 10.222.4.1
192.168.231.211/24 10.231.10.1
192.168.222.22/24 10.222.4.1

 
погонять sed-online можно на сайте sed. js. org

Всего записей: 2074 | Зарегистр. 31-03-2004 | Отправлено: 18:20 28-11-2022 | Исправлено: MAGNet, 20:15 28-11-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Можно самому запариться, не надеясь на формат вывода утилиты ip.
Код:
perl -MSocket -lane 'BEGIN { sub parse_proc($) { return pack("V*", unpack("N*", pack("H*", shift))); }} next if $. == 1; print inet_ntoa(parse_proc($F[1])) . "/" . unpack("%32b*", parse_proc($F[7])) . (int($F[3] & 0x0002) ? " " . inet_ntoa(parse_proc($F[2])) : "");' /proc/net/route
# можно чуточку сократить/упростить
perl -MSocket -lane 'BEGIN { sub parse_proc($) { return pack("V", hex(shift)); }} next if $. == 1; print inet_ntoa(parse_proc($F[1])) . "/" . unpack("%32b*", parse_proc($F[7])) . (int($F[3] & 0x0002) ? " " . inet_ntoa(parse_proc($F[2])) : "");' /proc/net/route
Тут мы сами разбираем данные из файла /proc/net/route. Если маршрута нет,  ни чего не выводим вторым полем.
 
p.s. да. однострочник может не самое читабельное, но зато можно скопировать и сразу выполнить.

----------
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 | Отправлено: 15:14 29-11-2022 | Исправлено: Alukardd, 19:26 29-11-2022
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Оказывается можно вывести ip r get и тогда поля, как статичной, так и динамичной маршрутизации выводятся в одинаковых местах и тогда просто:
ip=$(ip r get "$address" | head -1 | gawk '{print $1}')
gw=$(ip r get "$address" | head -1 | gawk '{print $3}')
 
единственный минус ip r get - адрес надо задавать с маской /32. При варианте с array, когда маршруты прописываются с другими масками (> /32) для проверки через ip r get надо создавать отдельный array, но и так уже не плохо.
 
MAGNet
Забрал в блокнот, спасибо, буду использовать.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 20:42 29-11-2022 | Исправлено: digital422, 20:44 29-11-2022
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
gateway'я может не быть в ответе вообще (как в ip route get, так и просто в ip route show). Например это характерно для туннелей типа точка-точка, или того же wireguard.
Поэтому если считаем что он есть, то можно смело парсить поле не по номеру, а как показал MAGNet: брать то что идёт после via.
Более того, ip route get удобен тем что можно задать то куда должен идти запрос (как раз-таки /32), а не искать самому подходящую сеть самому. К тому же ip route get учтёт все правила маршрутизации включаю PBR (Policy Base Routing).
 
Если же не использовать ip route get, то вообще ни в чём нельзя быть уверенным. Но с другой стороны, если окружение известно то ни каких проблем нет (обычно это так).
Для более сложных случае без утилиты ip всё равно будет тяжело. надо будет самому общаться с ядром через AF_NETLINK socket. По сути делая то что делает утилита ip, только выводить уже данные так как нужно нам.

----------
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 | Отправлено: 21:29 29-11-2022 | Исправлено: Alukardd, 21:36 29-11-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 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