Не правильно работает цикл for

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

djo
Сообщения: 18
ОС: Debian

Не правильно работает цикл for

Сообщение djo »

Здравствуйте!

Есть файл вида:
TDK_002 "6481" 93.128.35.166
TDK_Torg001 "6480" 90.111.37.166
...... и т.д
И есть список ip адресов.
Я пытаюсь выводить строку, которая совпадает по третьему полю со списком ip адресов, но цикл for, работает как-то не корректно.

ip="xxxxx xxxxx xxxxxx xxxxxx около 1000 ip"

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

#!/bin/bash
ip="xxxxx xxxxx xxxxxx xxxxxx около 1000 ip"
for ipaddr in $ip
do
awk '{if($3 ~ /'$ipaddr'/) print $0}' ddf
done

Находятся не все записи, а так же некоторые дублируются. Есть ли какой способ решить это на bash?
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Не правильно работает цикл for

Сообщение allez »

На мой взгляд, вовсе необязательно искать именно по третьему полю. Ведь IP-адрес в файле всего один на строчку, не так ли? Тогда вполне достаточно будет утилиты grep:

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

#!/bin/bash
ip="xxxxx xxxxx xxxxxx xxxxxx около 1000 ip"
for ipaddr in $ip
do
  grep "$ipaddr" ddf
done
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21258
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Не правильно работает цикл for

Сообщение Bizdelnick »

djo писал(а):
14.12.2012 12:20

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

ip="xxxxx xxxxx xxxxxx xxxxxx около 1000 ip"
for ipaddr in $ip

Все адреса обрабатываются как одна строка и, соответственно, цикл выполняется всего один раз. Почему бы не использовать циклы awk? (Я в нём не силён, поэтому ничего конкретного не подскажу.)
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Не правильно работает цикл for

Сообщение allez »

Bizdelnick писал(а):
14.12.2012 13:00
Все адреса обрабатываются как одна строка и, соответственно, цикл выполняется всего один раз.
Спорное утверждение. :)

Вот пример командной конструкции, которая была сваяна лично мной и лично у меня нормально работает в bash:

...

sites="opennet.ru www.opennet.ru mobile.opennet.ru \ yandex.ru ya.ru validator.w3.org microsoft.com \ google.com google.ru unixforum.org linuxforum.ru \ linux.ru linuxquestions.org kernel.org"; \ for site in ${sites}; \ do \ echo -ne "Site: ${site} "; \ w3m -dump http://validator.w3.org/check?uri=${site} | grep "Result"; \ done | column -t | sort -nr -k 4,4 | nl 1 Site: microsoft.com Result: 516 Errors, 486 warning(s) 2 Site: unixforum.org Result: 127 Errors, 6 warning(s) 3 Site: linux.ru Result: 119 Errors, 3 warning(s) 4 Site: www.opennet.ru Result: 75 Errors, 11 warning(s) 5 Site: yandex.ru Result: 44 Errors, 18 warning(s) 6 Site: opennet.ru Result: 39 Errors, 6 warning(s) 7 Site: linuxforum.ru Result: 30 Errors, 43 warning(s) 8 Site: google.ru Result: 27 Errors, 2 warning(s) 9 Site: google.com Result: 25 Errors, 3 warning(s) 10 Site: mobile.opennet.ru Result: 21 Errors, 6 warning(s) 11 Site: ya.ru Result: 7 Errors, 5 warning(s) 12 Site: linuxquestions.org Result: 2 Errors 13 Site: validator.w3.org Result: Passed 14 Site: kernel.org Result: Passed

Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Не правильно работает цикл for

Сообщение SLEDopit »

Да зачем сюда вообще циклы? Вы же фактически читаете ваш несчастный файл безумное количество раз, вам его совсем не жалко? (:
Делайте так:

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

#!/bin/bash
ip="xxxxx|xxxxx|xxxxxx|xxxxxx|около|1000|ip"
awk '{if($3 ~ "'$ip'")print}' ddf


allez писал(а):
14.12.2012 14:44
Спорное утверждение. :)

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

ip="xxxxx xxxxx xxxxxx xxxxxx около 1000 ip" ; for ipaddr in $ip ; do echo "$ipaddr" ; done
xxxxx
xxxxx
xxxxxx
xxxxxx
около
1000
ip
vs

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

ip="xxxxx xxxxx xxxxxx xxxxxx около 1000 ip" ; for ipaddr in "$ip" ; do echo "$ipaddr" ; done
xxxxx xxxxx xxxxxx xxxxxx около 1000 ip
Возможно, Bizdelnick имел в виду второй вариант, но не заметил, что кавычек нету.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Не правильно работает цикл for

Сообщение allez »

SLEDopit писал(а):
14.12.2012 14:46
Возможно, Bizdelnick имел в виду второй вариант, но не заметил, что кавычек нету.
Кстати, да. А я вот недосмотрел.

SLEDopit писал(а):
14.12.2012 14:46
Да зачем сюда вообще циклы?
Тоже весьма разумное замечание, а то мы тут в дебри полезли и за деревьями леса не заметили. :)

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

#!/bin/bash
ip="xxxxx|xxxxx|xxxxxx|xxxxxx|около|1000|ip"
grep -E "$ip" ddf

P. S. Что-то меня по grep прибило. :)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21258
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Не правильно работает цикл for

Сообщение Bizdelnick »

SLEDopit писал(а):
14.12.2012 14:46
Возможно, Bizdelnick имел в виду второй вариант, но не заметил, что кавычек нету.

Хм, в zsh и без кавычек работает точно так же.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Не правильно работает цикл for

Сообщение allez »

А-а, вон оно что! Ну да, в zsh так и есть. Но автор темы явным образом указал, что использует bash.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21258
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Не правильно работает цикл for

Сообщение Bizdelnick »

Ступил, стало быть.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Не правильно работает цикл for

Сообщение drBatty »

djo писал(а):
14.12.2012 12:20
Я пытаюсь выводить строку, которая совпадает по третьему полю со списком ip адресов, но цикл for, работает как-то не корректно.

нормально он работает. Вот смотрите:

$

$ for x in a b c d; do echo $x; done a b c d


очевидно, что ваш цикл разбивает каждую строчку на кусочки, разделённые пробельным символом.
проблема в том, что вы забыли кавычки поставить:

$

$ VAR="a b c d"; for x in "$VAR"; do echo $x; done a b c d $ VAR="a b c d"; for x in $VAR; do echo $x; done a b c d

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: