Страница 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
гм.. а если в файле одинарные слэши, то
уже их заменит\уберет...
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.sh
#!/bin/sh
NUM=20
read v < "test.txt"
echo $v
выводит:
А хочу чтобы выводило:
То есть, текст во внешнем файлы в некоторых местах указываем переменные и при прогоне они замещаются значениями переменных.
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
К сожалению пока не получилось сделать:
Но сам скрипт приобрел такой вид:
Код: Выделить всё
#!/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
Не уразумел смысла строки:
, а именно
Двойную кавычку заменяем на \" ?
Зачем?
Re: Отступы в файле. как?
Добавлено: 2011-11-13 16:50:04
InventoR
когда мы потом делаем:
eval echo -e "\"$st\""
до выхлоп получается совсем без ковычек. echo их сьедает.
по этому три подрят \\\ правят ситуацию.
Re: Отступы в файле. как?
Добавлено: 2011-11-13 17:01:54
kpp
А, точно
