|
Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!
Здравствуйте, гость ( Вход | Регистрация )
Сейчас обсуждают
 
| |
Нужна помощь монстров Grep/awk, Как передать output одной программы на выполнение другой? |
|
|
Jek |
25.12.2008, 9:27
|
Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588
Репутация: 1856
|
Доброе время суток! Извиняюсь, что не совсем в тему раздела, но подходящего на форуме нет, а здесь наверняка есть маньяки, которые в этом разбираются. У меня возникла примерно такая задача. На юниксовом сервере надо забирать с определенных 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 Вообще ума не приложу! Есть мнение, что здесь надо заюзать какой-то 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
|
ортодоксальный линуксоид
Группа: 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
|
Технический специалист
Группа: 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
|
Группа: Супермодераторы
Сообщений: 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 Обалдеть! Работает! А главное без промежуточного файла! Хорошая вещь все-таки awk . Спасибо за помощь!
|
|
|
|
mephisto |
25.12.2008, 10:58
|
ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849
|
Цитата(Jek @ 25.12.2008, 9:34) Обалдеть! Работает! А главное без промежуточного файла! Хорошая вещь все-таки awk . А причем тут awk? Это всё труба
|
|
|
|
ktak |
25.12.2008, 11:07
|
Технический специалист
Группа: VIP
Сообщений: 1 354
Регистрация: 18.12.2006
Из: Новосибирск
Пользователь №: 18
Репутация: 124
|
Цитата(Jek @ 25.12.2008, 9:34) Обалдеть! Работает! А главное без промежуточного файла! Хорошая вещь все-таки awk . То же самое без 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
|
|
|
|
Jek |
14.1.2009, 15:00
|
Группа: Супермодераторы
Сообщений: 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
|
ортодоксальный линуксоид
Группа: 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 |
12.11.2009, 11:36
|
Группа: Супермодераторы
Сообщений: 16 246
Регистрация: 27.9.2007
Из: N44.785780 E37.385650 WEB: https://irc.k-42.ru IRC: irc.sibnet.ru #iclub
Пользователь №: 6 588
Репутация: 1856
|
Снова уперся в незнание возможностей awk . Есть вот такой файлик: Код 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
|
ортодоксальный линуксоид
Группа: 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 |
19.3.2010, 15:43
|
Группа: Супермодераторы
Сообщений: 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-скрипта. Это как-то возможно? Или искать обходные пути? Вот небольшой пример: » Спойлер (нажмите, чтобы прочесть) « #!/bin/sh
BASE=`basename $0` CDIR=`pwd` CDIR_WITHOUT_PATH=`basename $CDIR` SOURCE=$CDIR/*.dat
# Получаем список папок уровнем ниже: # * только папки # * без . и .. # * без той папки, в которой находятся исходные файлы и этот скрипт # # К каждой обнаруженной папке применяем awk, составляем команду для копирования, а результат записываем в отдельный файлик.
ls -al .. | grep "^d" | awk '{ print $9 }' | grep -v "^\." | grep -v "$CDIR_WITHOUT_PATH" | awk '{ print "cp /var/tmp/5/*.dat ../" $1 }' >> masscopy.sh
# Хотя нафиг тут cp? Надо ln... Как можно избавиться от выделенного безобразия? Вместо него нужна shell-переменная $SOURCE.
|
|
|
|
mephisto |
19.3.2010, 15:50
|
ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849
|
Цитата(Jek @ 19.3.2010, 14:43) Снова не могу вникнуть в ситуацию. Понадобилось внутри awk-программки использовать переменную из shell-скрипта. Это как-то возможно? Или искать обходные пути? Вот небольшой пример: » Спойлер (нажмите, чтобы прочесть) « #!/bin/sh
BASE=`basename $0` CDIR=`pwd` CDIR_WITHOUT_PATH=`basename $CDIR` SOURCE=$CDIR/*.dat
# Получаем список папок уровнем ниже: # * только папки # * без . и .. # * без той папки, в которой находятся исходные файлы и этот скрипт # # К каждой обнаруженной папке применяем awk, составляем команду для копирования, а результат записываем в отдельный файлик.
ls -al .. | grep "^d" | awk '{ print $9 }' | grep -v "^\." | grep -v "$CDIR_WITHOUT_PATH" | awk '{ print "cp /var/tmp/5/*.dat ../" $1 }' >> masscopy.sh
# Хотя нафиг тут cp? Надо ln... Как можно избавиться от выделенного безобразия? Вместо него нужна shell-переменная $SOURCE. Код [mephisto@db ~]$ var=123 [mephisto@db ~]$ awk -v var="$var" '{print var}'
» Спасибо сказали: «
|
|
|
|
Jek |
20.9.2011, 9:36
|
Группа: Супермодераторы
Сообщений: 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 вывести все поля до конца строки, начиная с указанного. Есть вот такой вот файлик. » Спойлер (нажмите, чтобы прочесть) « Код C:\>tail -40 mac.txt
FC-E5-57 (hex) Nokia Corporation FCE557 (base 16) Nokia Corporation Elektroniikkatie 10 Oulu Ou 90590 FINLAND
FC-E8-92 (hex) Hangzhou Lancable Technology Co.,Ltd FCE892 (base 16) Hangzhou Lancable Technology Co.,Ltd Zone A,Floor 16,Zhongcai Building,68#,Tonghe Road,Binjiang District, Hangzhou Zhejiang 310051 CHINA
FC-ED-B9 (hex) Arrayent FCEDB9 (base 16) Arrayent 570 El Camino Real #150-419 Redwood City CA 94063 UNITED STATES
FC-F1-CD (hex) OPTEX-FA CO.,LTD. FCF1CD (base 16) OPTEX-FA CO.,LTD. 91 Awata-cho Chudoji Shimogyo-ku Kyoto 600-8815 JAPAN
FC-FA-F7 (hex) Shanghai Baud Data Communication Co.,Ltd. FCFAF7 (base 16) Shanghai Baud Data Communication Co.,Ltd. NO.123 JULI RD PUDONG ZHANGJIANG HIGH-TECH PARK SHANGHAI 201203 CHINA
FC-FB-FB (hex) Cisco Systems FCFBFB (base 16) Cisco Systems 80 West Tasman Dr. SJCM/2 San Jose CA 95134 UNITED STATES Мне из него нужны только вот эти строчки: » Спойлер (нажмите, чтобы прочесть) « Код C:\>cat mac.txt | grep -F "(base 16)" | tail -10 FCD4F2 (base 16) The Coca Cola Company FCD4F6 (base 16) Messana Air.Ray Conditioning s.r.l. FCE192 (base 16) Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd FCE23F (base 16) CLAY PAKY SPA FCE557 (base 16) Nokia Corporation FCE892 (base 16) Hangzhou Lancable Technology Co.,Ltd FCEDB9 (base 16) Arrayent FCF1CD (base 16) OPTEX-FA CO.,LTD. FCFAF7 (base 16) Shanghai Baud Data Communication Co.,Ltd. FCFBFB (base 16) Cisco Systems Из каждой строчки мне нужны все поля, кроме второго. Думал решить задачу по-простому - удалить это поле gsub'ом. Получилась вот такая хрень: » Спойлер (нажмите, чтобы прочесть) « Код C:\>cat mac.txt | grep -F "(base 16)" | awk '{gsub("(base 16)","",$0); print $0}' | tail -10 FCD4F2 () The Coca Cola Company FCD4F6 () Messana Air.Ray Conditioning s.r.l. FCE192 () Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd FCE23F () CLAY PAKY SPA FCE557 () Nokia Corporation FCE892 () Hangzhou Lancable Technology Co.,Ltd FCEDB9 () Arrayent FCF1CD () OPTEX-FA CO.,LTD. FCFAF7 () Shanghai Baud Data Communication Co.,Ltd. FCFBFB () Cisco Systems Пробовал экранировать скобки - не помогает. Пробовал использовать (base 16) в качестве разделителя полей - получилось тоже самое, что и в последнем варианте. На экранирование скобок не реагирует никак. Пробовал найти функцию, которая бы отдавала все поля, начиная с указанного - но почему-то не нашел. Может, как-то можно решить эту простую задачу?
|
|
|
|
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|