В винде часто использую следующую конструкцию:
1) имею файл со списком хостов и параметров, например счетчиками производительности. которые надо время от времени запускать, число счетчиков разное ,но не больше 7, например.
<hostname1>|<counter name1>|<counter name2>|<counter name3>
<hostname2>|<counter name1>|<counter name2>
<hostname3>|<counter name1>|<counter name2>
В скрипте пишу следующую конструкцию:
for /f "delims=|;tokens=1,2,3,4,5,6,7" do (
выполняю действия с переменными %%i (первое вхождение) %%j (второе) и т д.
)
При
том мануал по даной комманде в винде можно получить простой комбинацией: "help for" в cmd.exe
Вопросы:
1) Каким образом выполнить парсинг из шелла текстового файла с разделителями?
2) Какой командой можно получить мануал по такой команде? Пробовал "man for" - результат пустой, а в "man sh" по for описание короткое. Если есть мануал - прошу кинуть в меня им.
парснг текстовых файлов из shell
For — какбэ не команда, а оператор, поэтому man-страниц и нет. Ну а мануалка вот:
http://tldp.org/LDP/abs/html/loops.html
For — какбэ не команда, а оператор, поэтому man-страниц и нет. Ну а мануалка вот:
http://tldp.org/LDP/abs/html/loops.html
логично ,что оператор. Почему-то виндозники по мену мануал отдельно вынесли. Ну да ладно. По той ссылке все подробно описано. Спасибо. Но разбора строки, которая берется из файла там нет. Возможно два в одном в cmd сделано для уменьшения числа команд и, как следствие, для упрщения самого командного интерпретатора. Стало быть задача сводится к другому:
Какими командами можно пропарсить строку в shell-е? Может есть какой-нибудь strstr его можно было бы в цикле проанализировать.
1) Каким образом выполнить парсинг из шелла текстового файла с разделителями?
вариантов много. Вот мой вариант:
#!/bin/bash
FILE_NAME="t"
OLD_IFS="$IFS"
IFS="|"
declare ARRAY
while read S
do
echo "$S"
ARRAY=( $S )
for (( J=0; J<${#ARRAY[@]}; J++ ))
do
echo "$J - ${ARRAY[$J]}"
done
done <"$FILE_NAME"
IFS="$OLD_IFS"
Какой командой можно получить мануал по такой команде? Пробовал "man for" - результат пустой, а в "man sh" по for описание короткое. Если есть мануал - прошу кинуть в меня им.
man bash
[console]$ help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
Execute commands for each member in a list.
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
Exit Status:
Returns the status of the last command executed.
[/console]
helgisbox, ещё info bash прочитайте, если не хотите быть школьником.
Вот мой вариант
А какой смысл в строках:
OLD_IFS="$IFS"IFS="$OLD_IFS"?
А какой смысл в строках:
[console]$ echo "$IFS"|hexdump -C
00000000 20 09 0a 0a | ...|
00000004
[/console]
$IFS это список разделителей в bash'е, которые нужны для того, что-бы разрезать строку $S в этом месте кода:
ARRAY=( $S )если вы знакомы с php, то эта строка эквивалентна http://php.net/manual/ru/function.explode.php
Ну и да, разделители нужны и для другого, потому я их сохранил. Иначе ваш код будет очень неожиданно работать, если разделитель у вас будет "|".