Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, ну тут у меня есть 2 сценария применения - в первом остаётся всё как есть в текущем виде и грепается нужная строка, а втором нужно пройти второй круг и использовать делиметер "=". Что-то типа
Код:
echo 'abc=123&cde=456&fgh=789'|awk '{split($0,a,"&"); for (b in a) split(a[b],c,"="); print c[1]}'
но с выхлопом всех строк за вторым разделителем
p.s.
Цитата:
А в чём отличия между этими примерами ?  
Всё таки хочется понять, что выполняет данный код, а не тупо его использовать (понимание прийдёт со временем, но если не трудно, разъясните )

Всего записей: 2319 | Зарегистр. 19-09-2011 | Отправлено: 20:12 10-11-2019 | Исправлено: Baltazar500, 20:13 10-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
Цитата:
Всё таки хочется понять, что выполняет данный код, а не тупо его использовать
1. Это сплит $0(т.е. всей строки) внутри блока. На самом деле вычисление $1 тут тоже происходит (по дефолту разделитель любое количество табов и/или пробелов)
2. сразу устанавливаем нужный разделитель и получаем разбивку по полям. По сути тот же split, но сразу для каждой строки.
3. а тут я сказал, что считай новой строкой не \n, а &. И дальше вывел всё по строчно.
 

Цитата:
грепается нужная строка
почему бы сразу не отфильтровать нужное в awk?
 
Не очень понял что нужно и зачем так и реально ли данные такие, или Вы их сильно упростили для примера. Потому что то Вы описали делается одним grep'ом: grep -oP '[^=&]*(?==)'
Ну или вот на awk, как Вы написали, только скобки забыли:
Код:
echo 'abc=123&cde=456&fgh=789' | awk '{split($0, a, "&"); for (b in a) { split(a[b],c,"="); print c[1] }}'
Ну или вот: echo 'abc=123&cde=456&fgh=789' | awk 'BEGIN{RS="&"} {sub("=.*",""); print}'

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 17:33 11-11-2019
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd,
Цитата:
1. Это сплит $0(т.е. всей строки) внутри блока. На самом деле вычисление $1 тут тоже происходит (по дефолту разделитель любое количество табов и/или пробелов)
2. сразу устанавливаем нужный разделитель и получаем разбивку по полям. По сути тот же split, но сразу для каждой строки.
3. а тут я сказал, что считай новой строкой не \n, а &. И дальше вывел всё по строчно.  
Вроде бы понятно, но надо будет попрактиковаться, используя подобное, дабы до конца осмыслить
Цитата:
почему бы сразу не отфильтровать нужное в awk?  
Э ... а как ?
Цитата:
Не очень понял что нужно и зачем так и реально ли данные такие, или Вы их сильно упростили для примера.
Это добавочные параметры для cgi-скрипта и их разбор, так что за исключением содержимого вводных данных всё так и есть
Цитата:
Потому что то Вы описали делается одним grep'ом: grep -oP '[^=&]*(?==)'
Не везде есть grep с поддержкой перловских выражений а awk чуть ли не в каждом утюге )))
 
Сейчас вот вылезла вот такая задачка :
Код:
Вводные данные :
 
data="abc###/jkl?aaa=stu
def###/mno?aaa=vwx
ghi###/pqr?aaa=yz"
При использовании
Код:
echo "$data"|awk '{split($0,a,"###"); for (b in a) {split(a[b],c,"="); print a[1] "###" c[2]}}'
получаю
Код:
abc###
abc###stu
def###
def###vwx
ghi###
ghi###yz
 
вместо
Код:
abc###stu
def###vwx
ghi###yz
решаю проблему дополнительной командой
Код:
awk '{a=$0; getline; b=$0; split(b,c,"###"); print c[1] "###" c[2]}'
ЧЯДНТ ? Как всё это дело склеить в одну команду ?
 
 
p.s. Спасибо за помощь )))

Всего записей: 2319 | Зарегистр. 19-09-2011 | Отправлено: 07:41 20-11-2019 | Исправлено: Baltazar500, 07:47 20-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
Если просто исправить Ваш код, то это так:
Код:
echo "$data" | awk '{split($0,a,"###"); for (b in a) {split(a[b],c,"="); if (c[2]) print a[1] "###" c[2]}}'

А если написать его попроще. то так:
Код:
echo "$data" | awk -F'###|=' '{print $1"###"$NF}'


----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 13:42 20-11-2019
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, спасибо ))) А как "отфильтровать нужное в awk"  ?  Т.е. в прошлой задаче
Цитата:
echo 'abc=123&cde=456&fgh=789' | awk '{split($0, a, "&"); for (b in a) { split(a[b],c,"="); print c[2] }}'
мне надо получить лишь 123, как мне это сделать без grep'a ?

Всего записей: 2319 | Зарегистр. 19-09-2011 | Отправлено: 09:21 21-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
Цитата:
мне надо получить лишь 123, как мне это сделать без grep'a ?
Шта?!
Приведённый Вами в вопросе код на awk уже делает то что нужно. Моя не понимать вопроса.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 00:09 22-11-2019
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, выхлоп команды
Цитата:
123
456
789
нужно "грепнуть" строку содержащую "123". В рамках awk без grep'a это возможно ?

Всего записей: 2319 | Зарегистр. 19-09-2011 | Отправлено: 10:16 22-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
например, так
Код:
echo 'abc=123&cde=456&fgh=789' | awk '{split($0, a, "&"); for (b in a) { split(a[b],c,"="); if (c[2] == "123") print c[2] }}'
, это если нужно точное совпадение, или заменить на ~ /123/ если нужно искать подстроку в строке.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 11:36 22-11-2019 | Исправлено: Alukardd, 11:37 22-11-2019
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, классно ))) Спасибо. Раз пошла такая пьянка, может и аналог sed'a у awk имеется ?

Всего записей: 2319 | Зарегистр. 19-09-2011 | Отправлено: 04:20 23-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
Цитата:
может и аналог sed'a у awk имеется ?
полагаю Вас просто интересует замена одной подстроки на другую, потому что, что sed, что awk это полноценные ЯП. Это всё равно что спросить есть ли аналог Java в C++?
 
Кроч, открываем man awk и читаем там про функции sub и gsub. А если у вас GNU AWK, то и про gensub.
 
Добавлено:
И вообще, в шапке темы есть несколько полезных ссылок, которые можно осилить, что бы познакомиться с awk.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 14:10 23-11-2019
Valery_Sh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
GAWK: Effective AWK Programming | Arnold D. Robbins
 
A User’s Guide for GNU Awk
Edition 4
December, 2012
 
https://yadi.sk/i/m7iYcQTj3am7zg

Всего записей: 2171 | Зарегистр. 30-06-2008 | Отправлено: 15:46 23-11-2019
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd,
Цитата:
полагаю Вас просто интересует замена одной подстроки на другую
почти :) Искомой подстроки на другую :)
Цитата:
Кроч, открываем man awk и читаем там про функции sub и gsub. А если у вас GNU AWK, то и про gensub.  
 
И вообще, в шапке темы есть несколько полезных ссылок, которые можно осилить, что бы познакомиться с awk.
ОК ;)  В любом случае спасибо за помощь :)
 
Valery_Sh, талмуд на английском, но всё равно спасибо :)

Всего записей: 2319 | Зарегистр. 19-09-2011 | Отправлено: 07:46 24-11-2019 | Исправлено: Baltazar500, 07:48 24-11-2019
Valery_Sh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
 
Увы, мова аглицкая. Но не Диккенс же...
man gawk - это, конечно, хорошо и правильно даже, однако книга с примерами лишней не бывает.

Всего записей: 2171 | Зарегистр. 30-06-2008 | Отправлено: 18:09 24-11-2019
sattan



taNo
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток.
Прошу помощи.
 
Есть .csv файл где в колонке 23 тысячи цифр. Необходимо брать число и делать grep по указанному пути к логам. То есть погрепать каждое из этих чисел по указаному пути к логам.
 
Не составляется строка поиска. Помогите плиз.

----------
к дракону надо приходить с подарками

Всего записей: 5227 | Зарегистр. 24-07-2001 | Отправлено: 18:14 25-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sattan
нипанятна, что надо-то? Что в файле, просто по одному числу в строке и всё? Логов много или один файл, большие ли они?
 
Кажется, хотите такого:
Код:
while read -r num; do grep -F "$num" /var/log/somecustomservice.log
этот способ не кажется самым быстрым способом, но возможно на Ваших объёмах данных он будет норма работать, а возможно что в любом случае придётся делать так как я предположил.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 20:55 25-11-2019
sattan



taNo
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
файл вида
число
число
число
число
 
 
надо брать число и грепать лог по указанно пути что то типа /path/**/**/*.log
 
я не могу понять как скормить для грепа эти данные из файла
 
то есть - берем число - грепаем по указанному пути
берем следующее - грепаем
и так повторить все 23 тысячи раз
 
в вашей команде я не очень понял, как будут браться числа из файла

----------
к дракону надо приходить с подарками

Всего записей: 5227 | Зарегистр. 24-07-2001 | Отправлено: 22:11 25-11-2019 | Исправлено: sattan, 22:49 25-11-2019
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
sattan
Цитата:
в вашей команде я не очень понял, как будут браться числа из файла
Скорее всего камрад Alukardd не допечатал что-то такое:
Код:
while read -r num; do grep -F "$num" /var/log/somecustomservice.log; done < file.csv
Внутрь "do" рекомендуется вставить пайп после грепа и его аргументов для использования его (grep`а) результатов.
 
 
Alukardd
Цитата:
этот способ не кажется самым быстрым способом
Размышления вслух.
Повлияет ли на общую скорость в этом примере скармливание grep`у шаблона из нескольких полей входного файла объединенных логическим "ИЛИ"?

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 00:23 26-11-2019 | Исправлено: karavan, 02:21 26-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan
Цитата:
не допечатал что-то такое
да, спасибо)))

Цитата:
Повлияет ли на общую скорость в этом примере скармливание grep`у шаблона из нескольких полей входного файла объединенных логическим "ИЛИ"?
должно, да. Если это будут просто статичные строки, после какого-то момента ( я не силён в математике) регулярка становится сложной для поиска её в строке и лучше уже гнать их по штучно. Я и так немного его ускорил за счёт опции --fixed-strings.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 10:51 26-11-2019
sattan



taNo
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
попробовал эту команду
while read -r num; do grep -F "$num" /var/log/somecustomservice.log; done < file.csv
на своем логе - в файл file.csv добавил числа, которые точно есть в логе
вывод нулевой - ничего не нашло
что я делаю не так ?
.csv сохранил как .txt для удобства
 
з.ы. скорость не важна - важно проверить наличие всех чисел в логах и выгрепать строки где они встречаются. никак не могу допетрить как скармливать эти числа грепу в цикле

----------
к дракону надо приходить с подарками

Всего записей: 5227 | Зарегистр. 24-07-2001 | Отправлено: 11:47 26-11-2019 | Исправлено: sattan, 11:55 26-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sattan
Цитата:
while read -r num; do grep -F "$num" /var/log/somecustomservice.log; done < file.csv
это точно работает
Покажите пример file.csv (пару чисел просто) И дайте десяток строк лога, каких не жалко, только так что бы хотя бы в одной-двух были искомые числа, а в остальных нет.
 
p.s. если искать по нескольким файлам, то можно сказать grep'у обойти каталог рекурсивно, либо передать список файлов. Но когда файла больше одного, то grep перед найденой строкой будет печатать имя файла в котором его нашёл, что бы спрятать имя файла, есть опция -h

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 12:12 26-11-2019 | Исправлено: Alukardd, 12:15 26-11-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru