LINUX.ORG.RU
ФорумAdmin

помогите с циклом в баш.

 


0

2
#!/bin/bash
lease=/var/lib/dhcpd/dhcpd.leases
while read line;
        do
ipaddr=$(grep -E "lease" "$line" | sed 's/lease\ //' | sed s/.$//)
macaddr=$(grep -E "hardware ethernet" "$line" | sed 's/\ hardware\ ethernet\ //' | sed s/.$//)
hostname=$(grep -E "client\-hostname" "$line" | sed 's/client\-hostname\ \"//' | sed s/.$// | sed s/.$//)
        echo "IP Address is:    "$ipaddr""
        echo "MAC Address is:   "$macaddr""
        echo "Hostname is:      "$hostname""
done < $lease

Все эти команды из консоли отрабатываются, но не в скрипте.

★★★★★

Ответ на: комментарий от zolden
# bash -xx whilecappor.sh 
+ lease=/var/lib/dhcpd/dhcpd.leases
+ read line
++ grep -E lease 'lease 10.46.12.151 {'
++ sed 's/lease\ //'
++ sed 's/.$//'
grep: lease 10.46.12.151 {: No such file or directory

Не могу понять почему он этот наркоманский смайлик как второй файл хочет взять.

dada ★★★★★ ()
Ответ на: комментарий от NeXTSTEP

я понял. то есть он хочет всё что после do применить ко всем строчкам???
а как мне ему сказать что 1-ый греп выполни для 1-ой строки, 2-ой греп для 4-ой строки и т.д ?

dada ★★★★★ ()
Ответ на: комментарий от dada

добавь echo перед grep. Xoтя зачем там вообще греп?

ipaddr=$(echo $line | grep -E "lease" | sed 's/lease\ //' | sed s/.$//)

eщё sed можно сократить: sed -e выражение1 -е выражение2

hope13 ★★★ ()
Последнее исправление: hope13 (всего исправлений: 1)
ipaddr=$(echo $line | grep -E "lease" | sed 's/lease\ //' | sed s/.$//)

у грепа второй аргумент - имя файла

aol ★★★★★ ()
Ответ на: комментарий от YAR
lease 10.46.12.154 {
  starts 3 2014/06/11 09:29:33;
  ends 4 2014/06/19 17:29:33;
  cltt 3 2014/06/11 09:29:33;
  binding state active;
  next binding state free;
  hardware ethernet 40:XX:XX:XX:XX::af;
  uid "\001@\260\372\274\226\257";
  client-hostname "android-15e";
dada ★★★★★ ()
Ответ на: комментарий от hope13

глазки раскрой ;)

у ТСа второй аргумент есть, но он явно не файл в контексте скрипта.

так что, твой камент про опциональность не привнёс сюда ни капли конструктива ;)

aol ★★★★★ ()
Ответ на: комментарий от hope13

о чем и речь. маны открывай быстро и решительно.

aol ★★★★★ ()
Ответ на: комментарий от YAR

Я так понимаю, для каждого такого блока надо получить находящиеся внутри него данные?

да. Моя проблема в том, что он каждый греп выполняет для каждой строчки.
После ip начинаются проблемы.

# bash -xx whilecappor.sh 
+ lease=/var/lib/dhcpd/dhcpd.leases
+ read line
++ echo lease 10.46.12.151 '{'
++ sed 's/lease\ //'
++ grep -E lease
++ sed 's/.$//'
+ ipaddr='10.46.12.151 '
++ echo lease 10.46.12.151 '{'
++ sed 's/\ hardware\ ethernet\ //'
++ sed 's/.$//'
++ grep -E 'hardware ethernet'
+ macaddr=

dada ★★★★★ ()
Ответ на: комментарий от hope13

в общем, я понял предмет нашего с тобой «недопонимания» :-D
твой ответ ТСу мне кажут только если включить отображение каментов от игнорируемых :-D
хотя, ни тебя, ни ТСа я не игнорю. кругом баги!

..и вообще, мутная тема - «Показано 8 сообщений из 18. Показать все.» ;)

aol ★★★★★ ()
Ответ на: комментарий от dada
rain@elitebook:/tmp$ awk '/^lease/{ip=$2; mac=""; hst=""}; /ethernet/{mac=$3; gsub(/;/, "", mac)}; /client-hostname/{hst=$2; gsub(/;|\"/, "", hst)}; /}/{print ip, mac, hst}' bla
10.46.12.154 40:XX:XX:XX:XX::af android-15e
10.46.12.155 41:XX:XX:XX:XX::af andro123id-15e
10.46.12.156 43:XX:XX:XX:XX::af andwwroid-15e
10.46.12.157 40:YY:XX:XX:XX::af androisdsd-15e
10.46.12.158 40:XX:XX:XX:ZZ::af android-666e
10.46.12.159 40:XX:XX:XX:XX:ЫЫ Windows

Как я понимаю, каждый блок lease закрывается }? Форматирование в последнем блоке добавить по вкусу

YAR ★★★★★ ()
Ответ на: комментарий от dada

Выше ведь уже показали. Не надо передавать грепу сразу 2 переменных. Ты не грепаешь файл, ты грепаешь данные, считываемые построчно из файла. Поэтому «echo данные | grep выражение | обработка»

YAR ★★★★★ ()
Ответ на: комментарий от YAR

У него вообще задума неверна: после _каждой_ строки печаталось бы

        echo "IP Address is:    "$ipaddr""
        echo "MAC Address is:   "$macaddr""
        echo "Hostname is:      "$hostname""
С минимум двумя пустыми полями.

Хм, ещё и что-то с кавычками.

echo данные

А если «данные» — "-n", "-e", "-eEen" и т.п.?

sshvabodka ()
Ответ на: комментарий от sshvabodka

после _каждой_ строки печаталось бы

Кстати, да. У меня это учтено.

А если «данные» — "-n", "-e", "-eEen" и т.п.?

Да, тогда неудобно.

rain@elitebook:/tmp$ data='-e'
rain@elitebook:/tmp$ echo "$data"

rain@elitebook:/tmp$ echo " $data"
 -e
rain@elitebook:/tmp$ grep e <<< "$data"
-e
YAR ★★★★★ ()
Ответ на: комментарий от sshvabodka

Это не то, что нужно.

Да. Но echo не понимает --, а пробел в данном случае не мешает работе. Опять же, я просто подстраиваюсь под предоставленные данные. В leases нет -e и тому подобного.

Зачем тогда советовать echo?

Если уж на то пошло, то я советовал awk. А «<<<» - башизм, «echo bla | grep something» - более общепринятый вариант

YAR ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.