получить части строки, используя сценарий оболочки

У меня есть одна строка как

/ip/192.168.0.1/port/8080/ 

Я хочу получить две отдельные переменные, которые будут содержать порт и IP-адрес

как. 192.168.0.1 и 8080

как я знаю / ip / и / port / будет всегда, я получил Ip следующим образом,

 expr /ip/192.168.0.1/port/8080/ : '/ip/\(.*\)/port/' 

это выведет 192.168.0.1 просто не знаю, как получить порт, я пробовал аналогичную команду,

 expr /ip/192.168.0.1/port/8080/ : '/port/\(.*\)/' 

но он не дает порт .. как получить порт также.

6 Solutions collect form web for “получить части строки, используя сценарий оболочки”

Вы можете использовать awk:

awk -F\/ '{print $2"="$3, $4"="$5}' input_file

с входным файлом или просто по строкам.

Вы можете просто использовать cut следующим образом:

 cut -d '/' -f 3,5 

Пример:

 $ echo '/ip/192.168.0.1/port/8080/' | cut -d '/' -f 3,5 192.168.0.1/8080 

Это вырезается с помощью разделителя / и печатает 3-й и 5-й поля.

Или, может быть, вы захотите:

 $ echo ip=`cut -d '/' -f 3 input_file` port=`cut -d '/' -f 5 input_file` ip=192.168.0.1 port=8080 

Еще один чистый метод bash с использованием массивов:

 $ s="/ip/192.168.0.1/port/8080/" # initial string $ a=(${s//// }) # substitute / with " " and make array $ echo ${a[1]} # Array index 1 (zero-based indexing) 192.168.0.1 $ echo ${a[3]} # Array index 3 (zero-based indexing) 8080 $ 

Или аналогично приведенному выше, но используя IFS вместо расширения параметров для разделения строки:

 $ OLDIFS="$IFS" # save IFS $ IFS="/" # temporarily set IFS $ a=($s) # make array from string, splitting on "/" $ IFS="$OLDIFS" # restore IFS $ echo "${a[2]}" # Array index 2 192.168.0.1 $ echo "${a[4]}" # Array index 4 8080 $ 

Обратите внимание, что этот метод потенциально более общий, чем два других в этом ответе, поскольку он должен работать, если интересующие поля содержат пробелы.


Или используя позиционные параметры:

 $ s="/ip/192.168.0.1/port/8080/" # initial string $ set -- ${s//// } # substitute / with " " and assign params $ echo $2 # Param 2 192.168.0.1 $ echo $4 # Param 4 8080 $ 
 expr /ip/192.168.0.1/port/8080/ : '.*/port/\(.*\)/' 

.* соответствует начальной части строки перед /port

С bash

 s=/ip/192.168.0.1/port/8080/ IFS=/ read -r _ _ ip _ port <<<"$s" echo "$ip" 192.168.0.1 echo "$port" 8080 

Это еще один способ

 $ cut -d '/' -f 3,5 <<< "/ip/192.168.0.1/port/8080/"|tr -s '/' ' ' 192.168.0.1 8080 
  • grep и умножить определенные столбцы
  • Изменение числа в строке чисел
  • Ошибка демона Cron: разрешение отклонено
  • Динамически читать имя функции bash изнутри функции bash
  • Разделение переменной bash
  • Удаление определенных типов файлов, кроме папки
  • Как запустить несколько процессов с помощью одной команды?
  • find и sed (найти и заменить) вызывает незаконную последовательность байтов в Mac OS X
  • Странные результаты тройного трубопровода в STDOUT & tee / dev / null> (wc -l> tmp.txt) & piping снова внедряют `cat tmp.txt`
  • Косвенно развернуть переменные в оболочке
  • Как пропустить первый аргумент в скрипте
  • Interesting Posts

    Неверная ошибка драйвера Vulkan с проприетарным драйвером Nvidia 358

    `sudo -u user script` даже не имеет доступа к / bin / sleep

    Каков самый Unix-y способ обработки stdout для команды резервного копирования, которая может завершиться неудачей?

    как узнать, являются ли диски от Jbod или интегральными как часть машины HW

    Проблема с screencapture flash-анимации в Chrome-браузере

    Bash: повторить последние команды N

    Объявить новый ключ-модификатор с помощью XKB

    Порядок сканирования системы сборки ядра kbuild / kconfig?

    Как мы можем избежать перезагрузки системы после изменения раздела с помощью fdisk?

    Как мне только отменить вложенный текст в vim?

    Совпадение шаблонов и grep вместе

    Правило Polkit для файлов блока шаблонов systemd

    Нет звука на динамиках, наушники в порядке

    Fedora 15 не будет помнить пароль беспроводной сети

    grep с шаблоном из одного файла (3.2Gb), соответствующего в другом файле (4.8Gb)

    Linux и Unix - лучшая ОС в мире.