LinuxForum.Fans
Тема

парснг текстовых файлов из shell

Автор: helgisbox 7 сообщений 2925 просмотров
02.10.2014 11:20 #394576

В винде часто использую следующую конструкцию:
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 описание короткое. Если есть мануал - прошу кинуть в меня им.

02.10.2014 11:27 #394578

For — какбэ не команда, а оператор, поэтому man-страниц и нет. Ну а мануалка вот:
http://tldp.org/LDP/abs/html/loops.html

02.10.2014 11:41 #394580
gabix написал:
For — какбэ не команда, а оператор, поэтому man-страниц и нет. Ну а мануалка вот:
http://tldp.org/LDP/abs/html/loops.html

логично ,что оператор. Почему-то виндозники по мену мануал отдельно вынесли. Ну да ладно. По той ссылке все подробно описано. Спасибо. Но разбора строки, которая берется из файла там нет. Возможно два в одном в cmd сделано для уменьшения числа команд и, как следствие, для упрщения самого командного интерпретатора. Стало быть задача сводится к другому:

Какими командами можно пропарсить строку в shell-е? Может есть какой-нибудь strstr его можно было бы в цикле проанализировать.

02.10.2014 11:54 #394582
"helgisbox" написал:
1) Каким образом выполнить парсинг из шелла текстового файла с разделителями?

вариантов много. Вот мой вариант:

text
#!/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"

"helgisbox" написал:
Какой командой можно получить мануал по такой команде? Пробовал "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]

02.10.2014 11:59 #394583

helgisbox, ещё info bash прочитайте, если не хотите быть школьником.

02.10.2014 14:35 #394632
"drBatty" написал:
Вот мой вариант

А какой смысл в строках:

text
OLD_IFS="$IFS"
text
IFS="$OLD_IFS"

?

02.10.2014 14:59 #394642
"beliy" написал:
А какой смысл в строках:

[console]$ echo "$IFS"|hexdump -C
00000000 20 09 0a 0a | ...|
00000004
[/console]
$IFS это список разделителей в bash'е, которые нужны для того, что-бы разрезать строку $S в этом месте кода:

text
ARRAY=( $S )

если вы знакомы с php, то эта строка эквивалентна http://php.net/manual/ru/function.explode.php

Ну и да, разделители нужны и для другого, потому я их сохранил. Иначе ваш код будет очень неожиданно работать, если разделитель у вас будет "|".

Войдите или зарегистрируйтесь, чтобы ответить.