Вот если есть строка вида
udp 0 0 11.11.11.11:53 0.0.0.0:* 5737/named
как разбить ее так на части, чтобы получить в переменную последнее значение ( 5737/named)?
И как потом разбить это значение снова на 2 переменных - 5737 и named?
Как вообще разбивать строку по заданному шаблону (любому) на заданное число частей?
Т.е., к примеру, из вышеуказанной строки получить переменные вида
$perem1 = udp
$perem2 = 11.11.11.11:53
$perem3 = 5737/named
К примеру, есть split, а тут как?
Перл не знаю, знаю php.
Разделение строки по шаблону (как?)
Модератор: Модераторы разделов
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
-
Fkabir
- Сообщения: 369
Re: Разделение строки по шаблону
То, что есть в php, я знаю.
Но если в шеле я делаю скрипт, мне надо же не на php делать? А bash scripting. Т.е. файлы будут не php. Потому я и спрашиваю, есть ли в bash такой аналог, как в php split?
Или как лучше сделать? Файлы будут парсить вот похожие строки, как я выше указал, и в зависимости от результата запускать команды шела типа ifconfig и т.п., потому на php не проканает, как понимаю.
Но если в шеле я делаю скрипт, мне надо же не на php делать? А bash scripting. Т.е. файлы будут не php. Потому я и спрашиваю, есть ли в bash такой аналог, как в php split?
Или как лучше сделать? Файлы будут парсить вот похожие строки, как я выше указал, и в зависимости от результата запускать команды шела типа ifconfig и т.п., потому на php не проканает, как понимаю.
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Разделение строки по шаблону
Fkabir
Например так:
Например так:
Код: Выделить всё
text='udp 0 0 11.11.11.11:53 0.0.0.0:* 5737/named'
pid=$(echo $text | cut -d ' ' -f 6 | cut -d '/' -f 1)
process=$(echo $text | cut -d ' ' -f 6 | cut -d '/' -f 2)-
Fkabir
- Сообщения: 369
Re: Разделение строки по шаблону
Спасибо, serzh-z.
Я правильно понял, что
Разбивает на 6 частей по пробелу, а далее cut -d '/' -f 1) разбивает на 1 часть?
А в process уже на 2 части?
Обязательно делать pid и потом process?
Если да, то почему cut -d '/' -f 2 в process, а в pid - 1?
А теперь как работать с переменными? Т.е как получить
$perem1 = udp
$perem2 = 11.11.11.11:53
$perem3 = 5737/named
Я правильно понял, что
Код: Выделить всё
pid=$(echo $text | cut -d ' ' -f 6 | cut -d '/' -f 1)Разбивает на 6 частей по пробелу, а далее cut -d '/' -f 1) разбивает на 1 часть?
А в process уже на 2 части?
Обязательно делать pid и потом process?
Если да, то почему cut -d '/' -f 2 в process, а в pid - 1?
А теперь как работать с переменными? Т.е как получить
$perem1 = udp
$perem2 = 11.11.11.11:53
$perem3 = 5737/named
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Разделение строки по шаблону
Fkabir
Как много вопросов... "man cut" или "cut --help" даст все ответы.
Как много вопросов... "man cut" или "cut --help" даст все ответы.
-
OCTAGRAM
- Сообщения: 28
- ОС: Mac OS X
Re: Разделение строки по шаблону
Если строки разделены пробелом, то есть read:
В более сложных случая строку нужно обработать sed-ом в формат, пригодный для read, либо вытаскивать sed-ом каждое значение по отдельности. Вот, например, формат, непригодный для read:
А вот, как нужно извлекать значения в таких случаях:
Сначала надо удалить первую строку.
Теперь оставшиеся строки распарсить по шаблону и перевести в формат, пригодный для read:
Ну а теперь их можно прочёсывать read-ом:
Код: Выделить всё
$ printf "%s" "1 2 3 4 5" | { read loc_a loc_b loc_c; printf "%s\n%s\n%s\n" "$loc_a" "$loc_b" "$loc_c"; }
1
2
3 4 5В более сложных случая строку нужно обработать sed-ом в формат, пригодный для read, либо вытаскивать sed-ом каждое значение по отдельности. Вот, например, формат, непригодный для read:
Код: Выделить всё
xen:~ OCTAGRAM$ otool -L /opt/local/bin/mc
/opt/local/bin/mc:
/opt/local/lib/libintl.8.dylib (compatibility version 9.0.0, current version 9.2.0)
/opt/local/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.3)
/opt/local/lib/libglib-2.0.0.dylib (compatibility version 1401.0.0, current version 1401.4.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)А вот, как нужно извлекать значения в таких случаях:
Сначала надо удалить первую строку.
Код: Выделить всё
xen:~ OCTAGRAM$ otool -L /opt/local/bin/mc | sed -E '1d'
/opt/local/lib/libintl.8.dylib (compatibility version 9.0.0, current version 9.2.0)
/opt/local/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.3)
/opt/local/lib/libglib-2.0.0.dylib (compatibility version 1401.0.0, current version 1401.4.0)
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)Теперь оставшиеся строки распарсить по шаблону и перевести в формат, пригодный для read:
Код: Выделить всё
xen:~ OCTAGRAM$ otool -L /opt/local/bin/mc | sed -E '1d;s/^.([^ ]+) \(compatibility version ([^ ]+), current version ([^ ]+)\)/\1 \2 \3/'
/opt/local/lib/libintl.8.dylib 9.0.0 9.2.0
/opt/local/lib/libiconv.2.dylib 7.0.0 7.0.0
/usr/lib/libSystem.B.dylib 1.0.0 88.3.3
/opt/local/lib/libglib-2.0.0.dylib 1401.0.0 1401.4.0
/usr/lib/libncurses.5.4.dylib 5.4.0 5.4.0Ну а теперь их можно прочёсывать read-ом:
Код: Выделить всё
xen:~ OCTAGRAM$ otool -L /opt/local/bin/mc | sed -E '1d;s/^.([^ ]+) \(compatibility version ([^ ]+), current version ([^ ]+)\)/\1 \2 \3/' | while read lib_install_name lib_compat_version lib_current_version; do printf "Library install name: %s\nCompatibility version: %s\nCurrent version: %s\n" "$lib_install_name" "$lib_compat_version" "$lib_current_version"; done
Library install name: /opt/local/lib/libintl.8.dylib
Compatibility version: 9.0.0
Current version: 9.2.0
Library install name: /opt/local/lib/libiconv.2.dylib
Compatibility version: 7.0.0
Current version: 7.0.0
Library install name: /usr/lib/libSystem.B.dylib
Compatibility version: 1.0.0
Current version: 88.3.3
Library install name: /opt/local/lib/libglib-2.0.0.dylib
Compatibility version: 1401.0.0
Current version: 1401.4.0
Library install name: /usr/lib/libncurses.5.4.dylib
Compatibility version: 5.4.0
Current version: 5.4.0If you want to get to the top, you have to start at the bottom
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Разделение строки по шаблону
в не слишком сложных случаях можно засунуть строку в массив
Код: Выделить всё
array=( $string )если строку делят не пробелы, а что-то другое, то меняем $IFS
Код: Выделить всё
OLD_IFS=$IFS
IFS="№"
a=( $line )
IFS=$OLD_IFSну а в совсем запущенных случаях - sed, как выше уже написано
PS:
да, доступ к массиву:
${array[17]} #даёт значение 17го эл-та