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

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



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

Цитата:
-g отчего зависит тогда

Один сервер что-то поддерживает, что-то не поддерживает, что-то возможно админ заблокировал наверное
Надо пробовать разные варианты
 
Я сегодня возможно выложу ещё кое-что
Есть у меня тоже один фтп-сервер с которым эти два метода не работают

Всего записей: 1533 | Зарегистр. 16-10-2005 | Отправлено: 15:12 21-02-2020 | Исправлено: andreyefgs, 15:13 21-02-2020
los

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

Цитата:
Удивительно, что этого флага нет в man-файле, нашел его в ncftpls --help  

там вообще присутствуют разночтения между 'man ncftpls' и 'ncftpls --help', что в ключах, что в примерах.

Всего записей: 7731 | Зарегистр. 08-09-2001 | Отправлено: 15:26 21-02-2020
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Чего-то я не понял.

Код:
lftp user@host.com:/>find / |  egrep -i '\.(xlsx|xls|xml|csv|txt)$' > list.txt

результат:
sh: 1: Syntax error: "(" unexpected
 
почему не парсится вывод?
 
Добавлено:
Вроде всё на месте
 
Добавлено:

где-то что-то рядом, где? Скобки на месте...

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 16:56 21-02-2020
andreyefgs



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скрипт с curl-ом для серверов, которые не дают полный путь
 
Код
 
Для тестирования с другими серверами надо отредактировать эти две строки:

Код:
get_dirs "ftp://ftp.ncftp.com//"
arr=($(curl "$d" | egrep -i '^[^d].*\.(gz|bz2)' | awk '{print $NF}'))

 
Можно так (для первой строки):

Код:
get_dirs "ftp://login:password@ftp.microsoft.com//"
get_dirs "ftp://login:password@ftp.microsoft.com//Folder/"

 
Если только сервер, то в конце "//", нет - "/"
 
Во второй надо изменить список расширений
 
ЗЫ
Но это медленный вариант, хотя и рабочий
Надо что-то другое придумать
 
 

Всего записей: 1533 | Зарегистр. 16-10-2005 | Отправлено: 17:50 21-02-2020 | Исправлено: andreyefgs, 17:51 21-02-2020
karavan



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

Цитата:

Код:
lftp user@host.com:/>find / |  egrep -i '\.(xlsx|xls|xml|csv|txt)$' > list.txt

результат:
sh: 1: Syntax error: "(" unexpected

А если так?
Код:
grep -iE '\.(xlsx|xls|xml|csv|txt)$'

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 18:10 21-02-2020
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andreyefgs (17:50 21-02-2020)
Цитата:
Скрипт с curl-ом для серверов, которые не дают полный путь

 
curl: (9) Server denied you to change to the given directory
 
karavan
Цитата:
А если так?

Цитата:
sh: 1: Syntax error: "(" unexpected

Даже если порсто  

Код:
grep -xlsx|xls|xml|csv|txt|eml|pst
то
Цитата:
sh: 1: xls: not found
sh: 1: xml: not found
sh: 1: csv: not found
sh: 1: txt: not found
sh: 1: eml: not found
sh: 1: pst: not found

 
Добавлено:
А вот если просто grep txt, к примеру, то парсит вывод как и ожидается
 
Добавлено:
andreyefgs
если указать каталог принудительно, как
Код:
get_dirs "ftp://login:password@ftp.microsoft.com//Folder/"
то
Цитата:
curl: (78) RETR response: 550

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 20:57 21-02-2020 | Исправлено: qw12, 21:01 21-02-2020
andreyefgs



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

Цитата:
curl: (9) Server denied you to change to the given directory

Встречался с такой ошибкой когда тестировал, но она пропала после добавления дополнительного слеша после ip в Url-е (ftp://admin:password@99.666.666.99)
Сейчас почему-то не могу воспроизвести ее
 
ЗЫ
Если найдёте публичный сервер использование которого порождает такие же проблемы как и вашего приватного
То я попробую что-нибудь придумать
А в таком режиме сложно
 
 
Добавлено:
Использование lftp
 

Код:
#!/bin/bash
 
echo > /tmp/listing.txt
count=0
 
IFS=$'\n'
arr=($(lftp -c "open ftp://ftp.ncftp.com//ncftpd/ && find -l && exit"))
 
shopt -s nocasematch
 
for f in "${arr[@]}"; do
  if [[ "$f" =~ ^d.*$ ]]; then
    continue
  else
    col=$(echo "$f" | awk '{print $NF}')
    if [[ "$col" =~ ^.*(bz2|gz)$ ]]; then
      echo "$col" >> /tmp/listing.txt
      let count++
    fi
  fi
done
 
echo "End!"
echo "${count} files"
 

 
В /tmp/listing.txt записываются такие строки:

Код:
 
./end_of_life/ncftpd-2.8.7-tru64unix5.1-alpha-export.tar.gz
./goodies/ncdbm-current.tar.gz
 

 
Для тестирования с другими серверами надо отредактировать эти две строки в скрипте:

Код:
arr=($(lftp -c "open ftp://ftp.ncftp.com//ncftpd/ && find -l && exit"))
 if [[ "$col" =~ ^.*(bz2|gz)$ ]]; then

 
Проверил с этим сервером и другим приватным, с которым были проблемы при использовании ncftpls
Тоже норм. И быстро  

Всего записей: 1533 | Зарегистр. 16-10-2005 | Отправлено: 22:02 21-02-2020 | Исправлено: andreyefgs, 22:51 21-02-2020
qw12



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

Цитата:
Использование lftp

Вот это - работает. Спасибо!

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 00:25 22-02-2020
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, от чего зависит выбор типа сравнения («числа/строки») при сравнении «больше/меньше» двух значений, например в операторе if в скрипте на AWK?
 
Пример:
Код:
x=11;
y="5";
# ? что (0/1) следует ожидать от результата сравнения значений в скобках?
#1. (11>5)
#2. (11>"5")
#3. (x>5)
#4. (x>"5")
#5. (x>y)
# ...etc

Поясню. Неоднократно «обжигался» на подобных сравнениях (корректных, на мой взгляд). Теперь (если случайно не отвлекусь) – сравниваю заведомые числа только так: if((x-y)>0). Что вызывает некоторую досаду, но гарантированно работает.
+В т.ч. отказался и от конструкций типа: if(x) /и подобных/.
 
У меня: WinXP & GNU Awk 4.1.4, API: 1.1, но аналогичные проблемы наблюдались и в более ранних версиях gAwk.
 
?
 
Спасибо.

Всего записей: 262 | Зарегистр. 14-02-2009 | Отправлено: 09:46 05-03-2020
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
NvvLazyTiger
https://www.gnu.org/software/gawk/manual/html_node/Strings-And-Numbers.html
Цитата:
To force a string to be converted to a number, add zero to that string.

Всего записей: 12815 | Зарегистр. 11-03-2002 | Отправлено: 09:57 05-03-2020
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
file.txt содержит
text
text2
text3
и newline
$ cat file.txt | tr "\n" " " >out.txt
результат в out.txt
text text2 text3  - пробел после text3 и нет newline.
возможно ли получить результат без пробела и с newline без сторонних программ?

Всего записей: 7731 | Зарегистр. 08-09-2001 | Отправлено: 10:31 06-03-2020
karavan



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

Код:
cat test.txt | tr "\n" " " | sed 's/ $/\n/' > out.txt

 
Добавлено:

Цитата:
возможно ли получить результат без пробела и с newline без сторонних программ?

С одним только tr - нет.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 10:39 06-03-2020
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los
Смотря что считать сторонними программами...
Например BUILTIN возможности командной оболочки в которой Вы это запускаете можно использовать?

----------
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:53 06-03-2020
los

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

Цитата:
С одним только tr - нет.

спасибо.
Alukardd

Цитата:
Например BUILTIN возможности командной оболочки в которой Вы это запускаете можно использовать?

конечно. Просто подумал может я в tr что-то не так указываю.

Всего записей: 7731 | Зарегистр. 08-09-2001 | Отправлено: 11:08 06-03-2020 | Исправлено: los, 11:11 06-03-2020
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los
Тогда можно вообще без единой внешней утилиты обойтись, в том числе без cat и tr.

Код:
res=''; while read -r line; do [[ -z "$line" ]] && continue; res+=" $line"; done < file.txt; echo "${res:1}"


----------
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:20 06-03-2020 | Исправлено: Alukardd, 11:21 06-03-2020
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
los
sed такой же свой, как и tr. Им можно

Всего записей: 12815 | Зарегистр. 11-03-2002 | Отправлено: 11:21 06-03-2020
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, спасибо.
Pasha_ZZZ

Цитата:
sed такой же свой, как и tr. Им можно

для не gnu sed что посоветуете?
karavan

Код:
cat test.txt | tr "\n" " " | sed 's/ $/\n/' > out.txt

в моем случае отрабатывает неверно в отличие от

Код:
cat file.txt | tr "\n" " " | sed 's/[[:blank:]]*$//' >out.txt

Всего записей: 7731 | Зарегистр. 08-09-2001 | Отправлено: 11:35 06-03-2020
karavan



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

Цитата:
в моем случае отрабатывает неверно

Можно подробнее об окружении, какой дистр? Мне просто любопытно.
 
Добавлено:

Цитата:
cat file.txt | tr "\n" " " | sed 's/[[:blank:]]*$//' >out.txt

Ну и здесь как бы нет создания новой строки перед EOF, только удаление последнего пробела.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 11:40 06-03-2020
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los
В качестве SHEL в примере у меня bash.
 
Можно обойтись одним sed'ом
sed -z 's/\n/ /g; s/ $/\n/' file.txt
 
Можно одним awk
awk '{x=x" "$0} END{print substr(x,2)}' file.txt
 
У меня, если что, всё окружение GNUтое...

----------
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:59 06-03-2020
los

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

Цитата:
Можно подробнее об окружении, какой дистр? Мне просто любопытно.  

macOS - дела BSD-шные

Цитата:
Ну и здесь как бы нет создания новой строки перед EOF, только удаление последнего пробела.

и так создает без лишних указаний.
 
Alukardd

Цитата:
Можно обойтись одним sed'ом  

на BSD системах работать не будет - нет ключа 'z'

Цитата:
Можно одним awk  

с этим проблем нет

Цитата:
У меня, если что, всё окружение GNUтое...

я заметил

Всего записей: 7731 | Зарегистр. 08-09-2001 | Отправлено: 12:29 06-03-2020
Открыть новую тему     Написать ответ в эту тему

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