Страница 1 из 1

Отступы в файле. как?

Добавлено: 2011-11-13 0:09:35
InventoR
Собственно давно мучает вопрос:
есть файл.

Код: Выделить всё

        <item type="4" key="ifInErrors01" value_type="3">
          <description>ifInErrors01</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>public</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.1</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>
Как видно в нем много оступов.
Теперь берем файлик:

Код: Выделить всё

#!/bin/bash
while read line
do
echo -e "$line"
done < if
На выхлопе:

Код: Выделить всё

<item type="4" key="ifInErrors01" value_type="3">
<description>ifInErrors01</description>
<ipmi_sensor></ipmi_sensor>
<delay>30</delay>
<history>90</history>
<trends>365</trends>
<status>0</status>
<data_type>0</data_type>
<units>Bps</units>
<multiplier>0</multiplier>
<delta>1</delta>
То есть, весь выхлоп идет с обрезанными отступами в начале оригинального файла, а их хочется сохранить для наглядности, как бы это можно сделать в bash?

Re: Отступы в файле. как?

Добавлено: 2011-11-13 0:39:35
kpp
Перед циклом изменить переменную IFS на что-нить, надо подумать на что лучше или вообще все равно, лишь бы не на пробел и\или символ табуляции.

Код: Выделить всё

tIFS="${IFS}"   # на всякий пожарный сохраняем законное значение переменной
IFS='i'

цикл

IFS="${tIFS}"   # вернуть законное значение переменной

Re: Отступы в файле. как?

Добавлено: 2011-11-13 10:12:24
InventoR

Код: Выделить всё

while IFS=: read line
do
echo -e "$line"
done < if
Пасибо.

Re: Отступы в файле. как?

Добавлено: 2011-11-13 13:25:11
Bayerische
Вот мне интересно, если в файле встретится двойной бэкслэш (\\), как его без искажений обработать?

Re: Отступы в файле. как?

Добавлено: 2011-11-13 13:30:35
InventoR
сейчас как раз делаю.
через sed погоняешь в теле цикла:
st=`echo "$line" | sed 's/"/\\\"/g'`
не много извращенно, но работает.

Re: Отступы в файле. как?

Добавлено: 2011-11-13 14:36:13
kpp
гм.. а если в файле одинарные слэши, то

Код: Выделить всё

echo "$line" 
уже их заменит\уберет...

Re: Отступы в файле. как?

Добавлено: 2011-11-13 14:52:27
kpp
Предлагаю такой вариант:

Код: Выделить всё

sed 's/\\/\\\\/g' ${vhod_file} |
while IFS=":" read line
do
 echo "${line}"
done
Работает с любым кол-вом обратных слэшей.

Re: Отступы в файле. как?

Добавлено: 2011-11-13 15:11:30
InventoR
о. интересно. а как можно такое реализовать?

Код: Выделить всё

cat test.txt
${NUM}

Код: Выделить всё

cat test.sh
#!/bin/sh
NUM=20
read v < "test.txt"
echo $v
выводит:

Код: Выделить всё

./test.sh
${NUM}
А хочу чтобы выводило: То есть, текст во внешнем файлы в некоторых местах указываем переменные и при прогоне они замещаются значениями переменных.

Re: Отступы в файле. как?

Добавлено: 2011-11-13 15:22:46
kpp

Код: Выделить всё

read v < "text.txt"
# так
eval v="$v"
# или так
eval echo $v

Re: Отступы в файле. как?

Добавлено: 2011-11-13 15:25:25
InventoR
супер.
пошел осваивать и изобретать дальше.
пасибки

Re: Отступы в файле. как?

Добавлено: 2011-11-13 16:11:55
InventoR
К сожалению пока не получилось сделать:

Код: Выделить всё

sed 's/\\/\\\\/g' ${vhod_file} |
Но сам скрипт приобрел такой вид:

Код: Выделить всё

#!/bin/bash

FILE=$1
COUNT=$2

for ((i = 1; i <= ${COUNT}; i++)); do
NUM2=$i;

if [ $NUM2 -le 9 ] ; then
    NUM1=0${NUM2}
     else
  NUM1=${NUM2}
fi
    while IFS=: read line
    do
    st=`echo "$line" | sed 's/"/\\\"/g'`
    eval echo -e "\"$st\""
    done < $FILE
done
./script.sh text.txt 2

Это оригинальный файл. В местах которые надо заменить номера значений вписуем ${NUM1} ${NUM2}
Разница в том что NUM1 имеет формат 00, а NUM2 0-9

Код: Выделить всё

        <item type="4" key="ifInErrors${NUM1}" value_type="3">
          <description>ifInErrors${NUM1}</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>pub</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.${NUM2}</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>
Выхлоп:

Код: Выделить всё

        <item type="4" key="ifInErrors01" value_type="3">
          <description>ifInErrors01</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>priv</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.1</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>
        <item type="4" key="ifInErrors02" value_type="3">
          <description>ifInErrors02</description>
          <ipmi_sensor></ipmi_sensor>
          <delay>30</delay>
          <history>90</history>
          <trends>365</trends>
          <status>0</status>
          <data_type>0</data_type>
          <units>Bps</units>
          <multiplier>0</multiplier>
          <delta>1</delta>
          <formula>0</formula>
          <lastlogsize>0</lastlogsize>
          <logtimefmt></logtimefmt>
          <delay_flex></delay_flex>
          <authtype>0</authtype>
          <username></username>
          <password></password>
          <publickey></publickey>
          <privatekey></privatekey>
          <params></params>
          <trapper_hosts>localhost</trapper_hosts>
          <snmp_community>priv</snmp_community>
          <snmp_oid>.1.3.6.1.2.1.2.2.1.14.2</snmp_oid>
          <snmp_port>161</snmp_port>
          <snmpv3_securityname></snmpv3_securityname>
          <snmpv3_securitylevel>0</snmpv3_securitylevel>
          <snmpv3_authpassphrase></snmpv3_authpassphrase>
          <snmpv3_privpassphrase></snmpv3_privpassphrase>
          <applications/>
        </item>

Теперь это можно подставить в xml шаблон zabbix и действовать дальше.
В обще хочется конечно полностью допилить по максимуму генерацию шаблонов по параметрам.

Re: Отступы в файле. как?

Добавлено: 2011-11-13 16:21:08
kpp
Не уразумел смысла строки:

Код: Выделить всё

st=`echo "$line" | sed 's/"/\\\"/g'`
, а именно

Код: Выделить всё

sed 's/"/\\\"/g'
Двойную кавычку заменяем на \" ?
Зачем?

Re: Отступы в файле. как?

Добавлено: 2011-11-13 16:50:04
InventoR
когда мы потом делаем:
eval echo -e "\"$st\""

до выхлоп получается совсем без ковычек. echo их сьедает.
по этому три подрят \\\ правят ситуацию.

Re: Отступы в файле. как?

Добавлено: 2011-11-13 17:01:54
kpp
А, точно :pardon: