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

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос по SED/Regexp
 
Доброго времени суток, дорогие форумчане!
 
Не получается решить следующую небольшую проблемку. Есть текстовый файл с табличкой ip разделенных табуляторами (по 4-е ip в строчке). Мне нужно последовательно вырезать все айпишники из файла. Собственно у меня не получается вырезать кусок текста между табуляторами.
 
С надежной на советы и помощь, triangel.

Всего записей: 25 | Зарегистр. 06-12-2006 | Отправлено: 16:59 26-02-2014
arto

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

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 17:15 26-02-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
triangel, сrossposting detected. Если вам дают бесполезные ответы, это наиболее вероятно говорит о непонятности вопроса. Тов. arto верно вам указал, что сделать.
 

Внес в шапку ссылку на http://mywiki.wooledge.org — наверное самый самодостаточную на сегодняшний день коллекцию материалов, которая до этого присутствовала там только частично в лице Bash Pitfalls.
 

#: шапка версии ASE_DAG, 23:40 14-09-2013

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:27 27-02-2014 | Исправлено: ASE_DAG, 22:10 27-02-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть 2 csv файла, один оригинальный, второй отчетный. Для удобство последующего анализа свожу эти 2 файла в один через paste -d ";" file1.csv file2.csv. Все хорошо, но если во 2 файла будет пропуск строк(и) то весь смысл сведения теряется. Во 2 столбце каждого файла есть уникальный ID номер, как можно свести 2 csv используя эти номера. Вот примеры для понимания:
 
Так делается когда все строки совпадают:

Код:
1 123 имя 1 123 имя
2 234 имя 2 234 имя
3 456 имя 3 456 имя
4 567 имя 4 567 имя  

 
А вот так, когда строк не хватает:

Код:
 
1 123 имя 1 123 имя
2 234 имя 3 456 имя
3 456 имя  4 567 имя
4 567 имя  

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 13:07 10-03-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
$ sdiff file{1,2}.csv
1 123 имя                                                       1 123 имя
2 234 имя                                                       2 234 имя
3 456 имя                                                     <
4 567 имя                                                       4 567 имя


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:01 10-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Увы, хотя решение интересное.  Пример писал абстрактный, в реальности есть различие по первым ячейкам, в первом файле вместо цифр время HH:MM, а во втором HH:MM:SS и оно может отличаться по минутам и иногда по часам, поэтому sdiff не срабатывает.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 14:24 10-03-2014
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:26 10-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Файл 1
01:00 123 текст
03:10 234 текст
03:42 456 текст
10:11 567 текст
 
Файл 2 (отчет)
01:05:01 123 текст  
03:30:05 234 текст
03:40:10 456 текст
11:25:11 567 текст

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 14:38 10-03-2014 | Исправлено: digital422, 15:07 10-03-2014
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:53 10-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отредактировал предыдущее сообщение. sdif не работает, т.к. содержимое строк разное и отличается только первым столбцом, т.е. временем.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 15:09 10-03-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Свести файлы вдумчиво не проблема, например, на 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 | Отправлено: 21:55 10-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На выходе после сведения csv файлов должны быть пустые строки в местах несовпадения, сводить строки надо по цифровым значениям во 2 колонке, они не меняются.
 
Исходники:
  Файл 1  
01:00 123 текст  
03:10 234 текст  
03:42 456 текст  
10:11 567 текст  
11:11 678 текст  
   
  Файл 2 (отчет)  
01:05:01 123 текст    
03:30:05 234 текст  
11:25:11 567 текст
11:59:22 001 текст
12:22:22 678 текст
 
Должно получиться: (в 3 строке совпадений нет, поэтому идет смещение вниз, где номера 2 колонки совпадают)
 
01:00 123 текст 01:05:01 123 текст    
03:10 234 текст 03:30:05 234 текст  
03:42 456 текст  
10:11 567 текст 11:25:11 567 текст
                         11:59:22 001 текст
11:11 678 текст 12:22:22 678 текст

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 06:46 11-03-2014 | Исправлено: digital422, 07:32 11-03-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# perl -le '@a=do{open F,shift and <F>};chomp@a;@b=do{open F,shift and <F>};chomp@b;($a,$b)=(shift(@a),shift(@b));while(1){($a||$b)||last;my($aa,$bb)=((split" ",$a)[1],(split" ",$b)[1]);if($aa==$bb){print"$a $b";($a,$b)=(shift(@a),shift(@b))}elsif($aa<$bb){print"$a";$a=shift@a}else{print"\t$b";$b=shift@b}}' A.txt B.txt  
01:00 123 текст   01:05:01 123 текст    
03:10 234 текст   03:30:05 234 текст  
03:42 456 текст  
10:11 567 текст   11:25:11 567 текст
        11:59:22 001 текст
11:11 678 текст   12:22:22 678 текст  
#

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 10:11 11-03-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
ох уж этот perl...

----------
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 | Отправлено: 07:37 12-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не дружу с prel, arto-спасибо конечно. Не работает скрипт, уходит в цикл, как поменять разделитель с пробела на ;, зачем табуляция в  print"\t$b" ?

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 14:41 14-03-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а где не работает? у меня на ваших данных работает.
 
с какого пробела надо поменять на ';' ?
 
для выделения отсутствия строки в первом файле.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 14:52 14-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Разделитель - ; и после сведения строк разделитель тоже ;
01:00;123;текст;01:05:01;123;текст.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 15:38 14-03-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
perl -le '@a=do{open F,shift and <F>};chomp@a;@b=do{open F,shift and <F>};chomp@b;($a,$b)=(shift(@a),shift(@b));while(1){($a||$b)||last;my($aa,$bb)=((split";",$a)[1],(split";",$b)[1]);if($aa==$bb){print"$a;$b";($a,$b)=(shift(@a),shift(@b))}elsif($aa<$bb){print"$a;";$a=shift@a}else{print";$b";$b=shift@b}}'

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 15:57 14-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если первая строка в первом или 2 файле отличается скрипт уходит в цикл, отображается ;.
a.txt
00:59;123;текст
01:00;123;текст
 
b.txt
01:05:01;123;текст

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 22:07 14-03-2014
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте.
Подскажите, пожалуйста, почему команда:
sed 's!11/Feb/2014!12/Mar/2014!g' access/file > new/file
Создает в директории new файл с названием file, но с точно таким же содержимым что исходный.
Мне надо было заменить строку: 11/Feb/2014  
строкой: 12/Mar/2014
Подскажите, пожалуйста, почему этого не происходит?

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 23:02 14-03-2014
Открыть новую тему     Написать ответ в эту тему

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