КАРТА САЙТА
Sibnet.ru
Sibnet.ru

Sibnet.ru — это информационно-развлекательный интернет-проект, ориентированный на широкий круг Сибирского региона.
По данным Rambler Top100, Sibnet.ru является самым популярным порталом в Сибири.

Контакты:
АО "Ринет"
ОГРН 1025402475856
г. Новосибирск, ул. Якушева, д. 37, 3 этаж
отдел рекламы:
(383) 347-10-50, 347-06-78, 347-22-11, 347-03-97

Редакция: (383) 347-86-84

Техподдержка:
help.sibnet.ru
Авторизируйтесь,
чтобы продолжить
Некоторые функции доступны только зарегистрированным пользователям
Неправильный логин или пароль

Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!

Здравствуйте, гость ( Вход | Регистрация )



2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> Нужна помощь монстров Grep/awk, Как передать output одной программы на выполнение другой?
Jek
сообщение 25.12.2008, 9:27
Сообщение #1


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Доброе время суток! ngcool.gif

Извиняюсь, что не совсем в тему раздела, но подходящего на форуме нет, а здесь наверняка есть маньяки, которые в этом разбираются.

У меня возникла примерно такая задача. На юниксовом сервере надо забирать с определенных FTP-серверов небольшой набор файлов. В автоматическом режиме. Проблема в том, что ни одна стандартная юниксовая программа (fetch, curl, ftp) не умеет решать нужную мне задачу своими средствами. Поэтому было принято решение - написать небольшой скрипт.

Самое простое я сделал - написал целую строчку, которая выдает на консоль список нужных мне файлов на FTP-сервере. Строчка выглядит так:

Код
#!/bin/sh

curl -l ftp://192.168.0.1/logs/ | grep c2000

В результате выполнения этой строчки на стандартный вывод отправляется следующее:

Код
c2000-a635eb4f.log
c2000-e9f3025b.log
c2000-403c5515.log
c2000-211aebed.log

Внимание, вопрос! Как модернизировать этот скрипт, чтобы он к каждому файлу (т.е. к каждой выводимой на консоль строке) применял команду fetch? Примерно вот так:

Код
fetch ftp://192.168.0.1/logs/c2000-a635eb4f.log
fetch ftp://192.168.0.1/logs/c2000-e9f3025b.log
fetch ftp://192.168.0.1/logs/c2000-403c5515.log
fetch ftp://192.168.0.1/logs/c2000-211aebed.log

Вообще ума не приложу! ngblink.gif Есть мнение, что здесь надо заюзать какой-то awk, но я внимательно прочитал помощь к нему - и совершенно не врубился, что это такое, зачем это надо и как это может мне помочь. Вы моя последняя надежда! Рассмотрю любые варианты - с промежуточным файлом, на перле, на шелле и пр.

***************************************************************

После повторного перечитывания мана по awk и изучения пары примеров накидал вот такой скрипт:

Код
#!/bin/sh

curl -l ftp://192.168.0.1/logs/ | grep c2000 | awk '{print "fetch ftp://192.168.0.1/logs/"$1}' > i
chmod 755 i
./i >> /var/log/c2000.log

Он, конечно, работает именно так, как мне надо - в плане результата. Но может его можно как-то оптимизировать с учетом каких-то возможностей awk, о которых я не знаю?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 25.12.2008, 10:03
Сообщение #2


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



Вот тебе два эквивалентных по функционалу примера, выбирай какой тебе больше по душе:
Код

sh-3.1$ printf "1\n2\n3\n" | xargs -n 1 printf "arg = %s\n";
arg = 1
arg = 2
arg = 3

Код

sh-3.1$ printf "1\n2\n3\n" | while read i; do printf "arg = %s\n" $i; done
arg = 1
arg = 2
arg = 3
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ktak
сообщение 25.12.2008, 10:09
Сообщение #3


Технический специалист
Group Icon


Группа: VIP
Сообщений: 1 354
Регистрация: 18.12.2006
Из: Новосибирск
Пользователь №: 18



Репутация:   124  


Цитата(Jek @ 25.12.2008, 8:27) *

Он, конечно, работает именно так, как мне надо - в плане результата. Но может его можно как-то оптимизировать с учетом каких-то возможностей awk, о которых я не знаю?

Можно немного сократить:
Код
#!/bin/sh
curl -l ftp://192.168.0.1/logs/ | awk '/c2000/{print "fetch ftp://192.168.0.1/logs/"$1}' | sh >>  /var/log/c2000.log

Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 25.12.2008, 10:34
Сообщение #4


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Цитата(Ktak @ 25.12.2008, 10:09) *
Можно немного сократить:
Код
#!/bin/sh
curl -l ftp://192.168.0.1/logs/ | awk '/c2000/{print "fetch ftp://192.168.0.1/logs/"$1}' | sh >>  /var/log/c2000.log

Обалдеть! Работает! ogo.gif А главное без промежуточного файла! Хорошая вещь все-таки awk ngsmile.gif.

Спасибо за помощь!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 25.12.2008, 10:58
Сообщение #5


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



Цитата(Jek @ 25.12.2008, 9:34) *

Обалдеть! Работает! ogo.gif А главное без промежуточного файла! Хорошая вещь все-таки awk ngsmile.gif.

А причем тут awk? Это всё труба ngsmile.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ktak
сообщение 25.12.2008, 11:07
Сообщение #6


Технический специалист
Group Icon


Группа: VIP
Сообщений: 1 354
Регистрация: 18.12.2006
Из: Новосибирск
Пользователь №: 18



Репутация:   124  


Цитата(Jek @ 25.12.2008, 9:34) *

Обалдеть! Работает! ogo.gif А главное без промежуточного файла! Хорошая вещь все-таки awk ngsmile.gif.

То же самое без awk:
Код

#!/bin/sh
curl -l ftp://192.168.0.1/logs/ | sed '/c2000/!d; s|.*|fetch ftp://192.168.0.1/logs/&|' | sh >>  /var/log/c2000.log
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ktak
сообщение 25.12.2008, 11:51
Сообщение #7


Технический специалист
Group Icon


Группа: VIP
Сообщений: 1 354
Регистрация: 18.12.2006
Из: Новосибирск
Пользователь №: 18



Репутация:   124  


Ещё проще:

wget 'ftp://192.168.0.1/logs/*c2000*' -O - >> /var/log/c2000.log
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 25.12.2008, 12:02
Сообщение #8


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Цитата(Ktak @ 25.12.2008, 11:51) *
wget 'ftp://192.168.0.1/logs/*c2000*'

А wget так умеет?!! ogo.gif

Он у меня даже не вонзен здесь ngsmile.gif Сейчас попробую.

Сообщение отредактировал Jek - 25.12.2008, 12:04
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 25.12.2008, 14:33
Сообщение #9


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Да, велосипед как выяснилось уже давно изобрели nglol.gif.

Всем еще раз спасибо за помощь!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 14.1.2009, 15:00
Сообщение #10


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Поднимаем тему! Снова прошу помощи маньяков примерно по тому же вопросу. Вот такая команда

Код
supergate# ipnat -l | grep MAP | grep "]" | awk '{print $2 " " $8 " " $9}' >> ipnat.log

записывает в файл именно то, что мне нужно:

Код
10.17.2.45 [81.9.34.190 80]

А можно как-то убрать из вывода квадратные скобки? Я подозреваю, что их можно будет дальше в SQL-запросе заигнорить, но просто так, для общего развития интересно, какой утилиткой можно от них избавиться.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 14.1.2009, 15:23
Сообщение #11


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



Цитата(Jek @ 14.1.2009, 14:00) *

Поднимаем тему! Снова прошу помощи маньяков примерно по тому же вопросу. Вот такая команда

Код
supergate# ipnat -l | grep MAP | grep "]" | awk '{print $2 " " $8 " " $9}' >> ipnat.log

записывает в файл именно то, что мне нужно:

Код
10.17.2.45 [81.9.34.190 80]

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


Код

ipnat -l | grep MAP | awk '/]/{sub(/\[/,""); sub(/\]/,""); print $2 " " $8 " " $9}' >> ipnat.log




Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 14.1.2009, 16:10
Сообщение #12


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Цитата(mephisto @ 14.1.2009, 15:23) *
Код
ipnat -l | grep MAP | awk '/]/{sub(/\[/,""); sub(/\]/,""); print $2 " " $8 " " $9}' >> ipnat.log

Ого! Оказывается, о возможностях awk я почти ничего и не знаю! ngblink.gif

Спасибо за помощь! super.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 12.11.2009, 11:36
Сообщение #13


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Снова уперся в незнание возможностей awk sad.gif. Есть вот такой файлик:

Код
1257008595,3,234,10.100.152.50,10.100.152.255,137,137
1257008633,3,234,10.100.152.50,10.100.152.255,137,137
1257008641,2,96,85.222.16.48,10.100.152.50,2037,445
1257008670,3,234,10.100.152.50,10.100.152.255,137,137
1257008685,2,96,88.238.176.155,10.100.152.50,3982,445

Первое поле - это UNIX Time. Надо зачем-то его перевести в юзер-френдли вид. Я с помощью awk получаю значение первого поля, но не могу понять, как вместо него вонзить вывод команды date (в моем случае - date -u -d "1970-01-01 $1 sec GMT" +"%Y-%m-%d %T").

Код
cat stat.txt | awk -F, '{print $1 " " $2 " " $3 " " $4 " " $5 " " $6 " " $7}' > filtered.csv

Можно ли как-то в awk заюзать вывод шелл-команды, да еще и с параметром от awk'а? Вместо $1 нужен вывод date. Или проще обработать на Перле? Строк около 100.000.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 12.11.2009, 11:50
Сообщение #14


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



А что встроенные функции awk для работы со временем не канают ?
Код

anton@bc:~$ cat /tmp/1
1257008595,3,234,10.100.152.50,10.100.152.255,137,137
1257008633,3,234,10.100.152.50,10.100.152.255,137,137
1257008641,2,96,85.222.16.48,10.100.152.50,2037,445
1257008670,3,234,10.100.152.50,10.100.152.255,137,137
1257008685,2,96,88.238.176.155,10.100.152.50,3982,445
anton@bc:~$ gawk '{print strftime("%Y-%m-%d %H:%M:%S", $1)}' /tmp/1
2009-10-31 23:03:15
2009-10-31 23:03:53
2009-10-31 23:04:01
2009-10-31 23:04:30
2009-10-31 23:04:45
anton@bc:~$
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 12.11.2009, 12:10
Сообщение #15


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Цитата(mephisto @ 12.11.2009, 11:50) *
А что встроенные функции awk для работы со временем не канают ?

ogo.gif

Ого! И такие даже есть? У меня man awk всего на два экрана smile.gif

Спасибо за наводку!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 12.11.2009, 12:20
Сообщение #16


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



Цитата(Jek @ 12.11.2009, 11:10) *

ogo.gif

Ого! И такие даже есть? У меня man awk всего на два экрана smile.gif

Спасибо за наводку!

А я info читаю smile.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 19.3.2010, 15:43
Сообщение #17


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Снова не могу вникнуть в ситуацию. Понадобилось внутри awk-программки использовать переменную из shell-скрипта. Это как-то возможно? Или искать обходные пути?

Вот небольшой пример:

» Спойлер (нажмите, чтобы прочесть) «

Как можно избавиться от выделенного безобразия? Вместо него нужна shell-переменная $SOURCE.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
mephisto
сообщение 19.3.2010, 15:50
Сообщение #18


ортодоксальный линуксоид
Group Icon


Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849



Цитата(Jek @ 19.3.2010, 14:43) *

Снова не могу вникнуть в ситуацию. Понадобилось внутри awk-программки использовать переменную из shell-скрипта. Это как-то возможно? Или искать обходные пути?

Вот небольшой пример:

» Спойлер (нажмите, чтобы прочесть) «

Как можно избавиться от выделенного безобразия? Вместо него нужна shell-переменная $SOURCE.

Код

[mephisto@db ~]$ var=123
[mephisto@db ~]$ awk -v var="$var" '{print var}'


» Спасибо сказали: «
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 20.3.2010, 1:05
Сообщение #19


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Как все просто! ohmy.gif

Хорошие у тебя маны, я бы тоже не отказался такие курнуть biggrin.gif.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Jek
сообщение 20.9.2011, 9:36
Сообщение #20


     
Group Icon


Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588



Репутация:   1856  


Снова туплю. Нужно решить одну из следующих задач (какая проще):

1. Использовать в качестве разделителя полей строку со скобками.
2. Заставить awk вывести все поля до конца строки, начиная с указанного.

Есть вот такой вот файлик.

» Спойлер (нажмите, чтобы прочесть) «

Мне из него нужны только вот эти строчки:

» Спойлер (нажмите, чтобы прочесть) «

Из каждой строчки мне нужны все поля, кроме второго. Думал решить задачу по-простому - удалить это поле gsub'ом. Получилась вот такая хрень:

» Спойлер (нажмите, чтобы прочесть) «

Пробовал экранировать скобки - не помогает. Пробовал использовать (base 16) в качестве разделителя полей - получилось тоже самое, что и в последнем варианте. На экранирование скобок не реагирует никак. Пробовал найти функцию, которая бы отдавала все поля, начиная с указанного - но почему-то не нашел.

Может, как-то можно решить эту простую задачу? smile.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V  1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 19.4.2024, 8:34
Редакция: (383) 347-86-84

Техподдержка:
help.sibnet.ru
Размещение рекламы:
тел: (383) 347-06-78, 347-10-50

Правила использования материалов