На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
djo
Сообщения: 18
ОС: Debian
Сообщение
djo » 14.12.2012 12:20
Здравствуйте!
Есть файл вида:
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
Сообщение
allez » 14.12.2012 12:35
На мой взгляд, вовсе необязательно искать именно по третьему полю. Ведь 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
Сообщение
Bizdelnick » 14.12.2012 13:00
djo писал(а): ↑ 14.12.2012 12:20
Код: Выделить всё
ip="xxxxx xxxxx xxxxxx xxxxxx около 1000 ip"
for ipaddr in $ip
Все адреса обрабатываются как одна строка и, соответственно, цикл выполняется всего один раз. Почему бы не использовать циклы awk? (Я в нём не силён, поэтому ничего конкретного не подскажу.)
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows
Сообщение
allez » 14.12.2012 14:44
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
Сообщение
SLEDopit » 14.12.2012 14:46
Да зачем сюда вообще циклы? Вы же фактически читаете ваш несчастный файл безумное количество раз, вам его совсем не жалко? (:
Делайте так:
Код: Выделить всё
#!/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
Сообщение
allez » 14.12.2012 14:52
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
Сообщение
Bizdelnick » 14.12.2012 15:06
SLEDopit писал(а): ↑ 14.12.2012 14:46
Возможно, Bizdelnick имел в виду второй вариант, но не заметил, что кавычек нету.
Хм, в zsh и без кавычек работает точно так же.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows
Сообщение
allez » 14.12.2012 15:21
А-а, вон оно что! Ну да, в zsh так и есть. Но автор темы явным образом указал, что использует bash.
Bizdelnick
Модератор
Сообщения: 21258
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 14.12.2012 15:25
Ступил, стало быть.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 17.12.2012 11:49
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