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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

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
      Шпаргалка по частым синтаксическим оборотам.

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

 

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А, это работа меня развращает, в командной строке я всегда знаю с каким данными работаю. А в скриптах пишу побольше защит от дураков и различных пустот, пробелов и так далее. Да, сорян. советовать так не стоит((
 
Добавлено:
Так должно быть норм
while read -r f; do [[ -z $f ]] && continue; echo "f is $f"; done <<<"$(find /tmp/test/ -type f)"

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:31 05-02-2017 | Исправлено: Alukardd, 14:45 28-02-2017
shylExSSchumi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то не соображу, как упросить.
Задача: найти определённые строки в определённом файлике. Файлик лежит где-то глубоко в какой-то подпапке.
 
find ./ -name MyMailService.java | xargs fgrep 'mailService.'

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 16:30 10-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
shylExSSchumi
BASH 4 поддерживает рекурсивный глоббинг, ** (должна быть включена опция globstar)

Всего записей: 12398 | Зарегистр. 11-03-2002 | Отправлено: 16:41 10-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shylExSSchumi
Разве что так: find ./ -name MyMailService.java -exec fgrep 'mailService.' "{}" \;

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:59 10-02-2017 | Исправлено: Alukardd, 16:59 10-02-2017
shylExSSchumi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
э мой вариант мне понятней.

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 18:38 10-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shylExSSchumi
Ваш вариант использует не любимый мной xargs, ну тем не менее его всё равно надо приводить в порядок и тогда, возможно, он Вам уже не покажется "более понятным"...
find ./ -name MyMailService.java | xargs -I {} fgrep 'mailService.' "{}"
или так
find ./ -name MyMailService.java -print0 | xargs -0 fgrep 'mailService.'  (в "чистоте" этого варианта я менее уверен)

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:07 10-02-2017 | Исправлено: Alukardd, 19:09 10-02-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ> BASH 4 поддерживает рекурсивный глоббинг
 
А ГНУ Греп — рекурсивный обход по шаблону, если уж на то пошло.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 05:29 11-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Это да, а в сочетании с опцией --include=GLOB он полноценно заменил бы связку find ... grep.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 05:32 11-02-2017
zedxxx

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос по aria2c (сильно не пинайте, форум редиректит в этот топик).
Использую её для загрузки торрентов и есть необходимость добавить руками пира по ip:port. Это как-то возможно сделать? В доках не нашел...

Всего записей: 1505 | Зарегистр. 14-07-2008 | Отправлено: 18:26 16-02-2017 | Исправлено: zedxxx, 18:27 16-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Наверное подходящий топик... надо сконвертить JSON в строку с разделителями. К примеру такой:
Цитата:
{"name1":111,"name2":[[22,3333,44444,555,6666,"Name3","Name4"],[77,888,9],[0,11,222]]}
в строки надо сконвертировать все вложенные в массив name2 массивы, по отдельности. Т.е. на выходе должно быть
Цитата:
22;3333;44444;555;6666;Name3;Name4
77;888;9
0;11;222
В общем, через jq -c '.name2[]' получается
Цитата:
[22,3333,44444,555,6666,"Name3","Name4"]
[77,888,9]
[0,11,222]
а дальше, если добавить к строке | join(";") - ошибка
Цитата:
jq: error (at <stdin>:24): string ("") and number (22) cannot be added
exit status 5
и как применить tostring не ко всему массиву, а к каждому элементу - не нашел.

Всего записей: 12398 | Зарегистр. 11-03-2002 | Отправлено: 06:48 18-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
jq -r '.name2[] | @csv'
Как красиво заменить запятую на точку с запятой что-то не придумалось или туплю
 
Можно так
jq -r '.name2[] | @csv | gsub(",";";")', но если запятая будет внутри значения, то она так же заменится, что плохо...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:13 20-02-2017 | Исправлено: Alukardd, 13:24 20-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
Да я уж разобрался, без костылей и с любым символом:
Цитата:
jq -r '.name2[] | [ .[] | tostring ] | join(";")'

Всего записей: 12398 | Зарегистр. 11-03-2002 | Отправлено: 14:19 20-02-2017 | Исправлено: Pasha_ZZZ, 14:21 20-02-2017
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть небольшой скрипт, ищет в папке в файлах txt и log текст "error"  и выводит содержимое в отдельный файл. Все устраивает за исключением того, что если в файлах строки с "error" нет, то все равно появляется строка "### имя файла". Можно исправить?
 

Код:
 
for i in $(find $DATE_YM/$DATE_YMD/ -type f -name "*.txt" -printf "%f \n" -o -name "*.log" -printf "%f \n"); do
    for k in $(find $DATE_YM/$DATE_YMD/ -type f -name $i); do
    (echo ""; echo "###" $i; gawk "/error/" $k) > $oufile
done
done
 

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 17:18 24-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
Не знаю, что там у вас в файлах, но стоит попробовать grep -lH

Всего записей: 12398 | Зарегистр. 11-03-2002 | Отправлено: 17:36 24-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Только вот на этой станице практически идентичную задачу решали
Код:
while read -r f; do
  [[ -z $f ]] && continue
  res=$(grep error "$f")
   [[ -n $res ]] && echo "### $(basename "$f") $res"
done <<<"$(find "$DATE_YM/$DATE_YMD/" -type f -name '*.txt' -o -name '*.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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:45 24-02-2017 | Исправлено: Alukardd, 14:44 28-02-2017
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, это не совсем моя задача, тем более я при постановке задачи ее немного упростил, у меня в конструкции gawk "/error/" $k параметров на пару строк, идет выборка по времени, чтобы отчеты не повторялись и др., поэтому grep тут не справится. Я думаю не буду трогать тот скрипт, лучше обработать итоговый файл, а выглядит он так:

Код:
 
1.  Когда в файлах нужная строка не найдена
### событие1
 
### событие2
 
### событие3
 
2.  Когда в файлах строка найдена.
### событие1
09:02:47:22:  что-то есть в логах
 
### событие2
10:05:42:22:  что-то есть в логах2

 
Мне надо не выводить в конечный файл то что в п.1.

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 12:30 25-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
ну замените grep на awk и всё будет работать, главное что бы awk выдавал вообще пустоту если нету совпадений и не печатал там пустые строки. например. Если там есть пробелы и прочее в случае неудачи, то надо просто изменить проверку $res на то что Вам подойдёт.
Ну либо можно вообще все эти проверки и выводы сделать внутри awk, скажем в блоке END.
 
Тут, так сказать, нету Вашего кода — нету и примеров.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:13 25-02-2017
KrgUser

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
 
Есть переменные a и b, это наборы строк, и эти наборы отличаются на одну строку, причем эта строка может находиться в любом месте набора. Задача --- выделить как раз эту строку, "вычет"
Работает эта команда
Код:
diff --changed-group-format='%<%>' --unchanged-group-format='' <(echo "$a") <(echo "$b")
но, к сожалению, под MSYS это не подходит
 
Как решить задачу с помощью sed?
 
Спасибо

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 13:42 08-03-2017 | Исправлено: KrgUser, 13:43 08-03-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KrgUser
> Есть переменные a и b...
 
Не вижу.
 
> не подходит
 
Почему?  Чего не хватает?
 
> Как решить задачу с помощью sed?
 
Перректально.  Откуда такое ограничение на инструмент?
 
Добавлено:
KrgUser, так, ладно, не буду вас ждать:

$ comm -3 <(sort <<< "$a") <(sort <<< "$b")


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:20 08-03-2017
KrgUser

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Не вижу
А разве недостаточно сказанного
Цитата:
Есть переменные a и b, это наборы строк

Цитата:
Почему?  Чего не хватает?
Жалоба на то, что каналы (pipes) не реализованы. По этой же причине не будет работать
Цитата:
$ comm -3 <(sort <<< "$a") <(sort <<< "$b")
Подобные вещи уже попробовал
Цитата:
Откуда такое ограничение на инструмент?
Да в общем-то нет ограничения, просто интересно, можно ли таким способом. И, ничего извращенного не вижу в этом
 
Добавлено:
Если совсем уж туго с воображением, вот пример:
a:
qweqw wdw ssacasc
asd xccvdv sdfds
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg
 
b:
qweqw wdw ssacasc
asd xccvdv sdfds
assdasd sdfsdf dfgfghfgjh sdfsd
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg
 
И уточню еще раз: нужно, чтобы работало под MSYS

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 15:46 08-03-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум 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