Страница 1 из 1
Проблемы с for
Добавлено: 2008-05-30 17:06:12
NeonSunlight
Добрый день.
Пишу скрипт, который мог бы перечитывать dhcp.conf и набивать статическими арпами таблицу.
Может конечно и ламерский вопрос, но что-то у меня не выходит с конструкцие for. Вот примерно так:
Код: Выделить всё
for s in `cat /etc/dhcpd.conf | grep host | grep -v "\#" | awk '{print \$2, \$6}'`
do
echo IP = $s
done
на выходе получаю такое:
IP = host0
IP = 00:0d:93:9d:5c:13;
IP = host1
IP = 00:02:44:aa:c6:0f;
IP = host2
IP = 00:18:f8:ad:98:5d;
На входе в for должны быть строки вида "ip mac", а получается 2 строки с ip и mac.
т.е. for читает вход как массив, или я что-то не понимаю?
Заранее спасибо!
Re: Проблемы с for
Добавлено: 2008-05-30 17:39:39
Alex Keda
по пробелам делит
Re: Проблемы с for
Добавлено: 2008-05-30 18:01:44
NeonSunlight
Спасибо! Тогда логично предположить, что стоит их заменить на табуляцию, например, sed'ом, только как - непонятно... Символ табуляции я не знаю где найти. Или может быть поправить разделитель в первом awk'е ?
Re: Проблемы с for
Добавлено: 2008-05-30 20:46:00
Alex Keda
поделит по табам.
пустой символ - и всё. по нему и делит
Re: Проблемы с for
Добавлено: 2008-05-30 21:25:52
NeonSunlight
Сделал по-индийски, но все таки сделал. Может кому-то еще мой опыт будет полезен. Вот:
Код: Выделить всё
#!/bin/sh
arp -ad
for s in `cat /etc/dhcpd.conf | grep host | grep -v "\#" | awk '{printf "%s_%s\n", \$2, \$6}' | sed 's/;//g'`
do
ip=`echo $s | sed 's/_/ /g' | awk '{print $1}'`
mac=`echo $s | sed 's/_/ /g' | awk '{print $2}'`
arp -s $ip $mac
done
Re: Проблемы с for
Добавлено: 2008-05-31 7:29:25
zg
у меня есть подозрение, что можно обойтись только awk, можешь выложить пример того, что у тебя в /etc/dhcpd.conf лежит
Re: Проблемы с for
Добавлено: 2008-06-01 12:53:47
NeonSunlight
Там лежат такие конструкции, просто описываются статические привязки для dhcp:
Код: Выделить всё
host wifi1 { hardware ethernet 00:18:f8:ad:98:5d; fixed-address wifi1.host.ru; }
#host wifi2 { hardware ethernet 00:18:f8:ad:98:6c; fixed-address wifi2.host.ru; }
host wifi3 { hardware ethernet 00:18:f8:ad:9b:5e; fixed-address wifi3.host.ru; }
host wifi4 { hardware ethernet 00:13:46:98:17:df; fixed-address wifi4.host.ru; }
Re: Проблемы с for
Добавлено: 2008-06-01 13:19:03
zg
Код: Выделить всё
game# cat 1.sh
#!/bin/sh
awk '{if(match($0,"^[^#]"))print $1, substr($6,1,17)}' 1.txt | {
while read ip mac
do
echo -e "IP=$ip\tMAC=$mac"
done
}
game# ./1.sh
IP=host MAC=00:18:f8:ad:98:5d
IP=host MAC=00:18:f8:ad:9b:5e
IP=host MAC=00:13:46:98:17:df
game# cat 1.txt
host wifi1 { hardware ethernet 00:18:f8:ad:98:5d; fixed-address wifi1.host.ru; }
#host wifi2 { hardware ethernet 00:18:f8:ad:98:6c; fixed-address wifi2.host.ru; }
host wifi3 { hardware ethernet 00:18:f8:ad:9b:5e; fixed-address wifi3.host.ru; }
host wifi4 { hardware ethernet 00:13:46:98:17:df; fixed-address wifi4.host.ru; }
я только не понял, в каком поле у тебя ипы лежат.. ну если чё то править надо $1
Re: Проблемы с for
Добавлено: 2008-06-01 13:34:23
NeonSunlight
Спасибо огромное! Ипы берутся из named, т.е. это по сути wifi1.host.ru, wifi2.host.ru и т.д.
Re: Проблемы с for
Добавлено: 2008-06-08 17:22:55
krilya
подскажите плиз как на shell сделать такой цикл?
Re: Проблемы с for
Добавлено: 2008-06-08 17:32:19
NeonSunlight
только seq2 потребуется дополнительно установить из портов.
Re: Проблемы с for
Добавлено: 2008-06-08 17:43:35
krilya
спасибо, а для чего нужна тулза из портов? неужели штатными средствами нельзя сделать?
Re: Проблемы с for
Добавлено: 2008-06-08 19:28:27
zg
krilya писал(а):а для чего нужна тулза из портов?
а чтоб значения ручками не вводить, но у неё вроде есть какой-то аналог, который последовательности генерит, уже не помню.. надо искать
krilya писал(а): неужели штатными средствами нельзя сделать?
смотря что конкретно тебе надо? если цикл, то тут лучше использовать while, если конкретно for тогда лучше почитать учебники на тему циклов.
Re: Проблемы с for
Добавлено: 2008-06-09 2:50:37
NeonSunlight
krilya писал(а):спасибо, а для чего нужна тулза из портов? неужели штатными средствами нельзя сделать?
Как вариант - сделать через while и инкрементить счётчик в теле цикла.