Нарезка вывода grep в bash

Восстановить экспериментальные исходные коды MySQL 5.6 из экспериментальных на wheezy легко, почти тривиально. Однако вам потребуется много места на диске; после завершения сборки каталог сборки использовал 5,2 ГБ. Кроме того, для сборки требуется время и выполняется невероятное количество тестов. Я не стал рассчитывать время, но выделил пару часов. Можно отключить тесты, но я предлагаю дать им возможность запускаться - это безвредно, если они проходят. Они сделали это на моей машине. Хорошая новость в том, что я смог без проблем собрать и установить его. Я провел следующий базовый тест.

faheem@orwell:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 50
Server version: 5.6.16-1~exp1 (Debian)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

Итак, я могу хотя бы подключиться к серверу. Вот как выглядят установленные пакеты:

$ dpkg -l | grep mysql

ii  libdbd-mysql-perl                     4.021-1+b1              amd64                   Perl5 database interface to the MySQL database
ii  libmysqlclient18:amd64                5.5.35+dfsg-0+wheezy1   amd64                   MySQL database client library
ii  libqt4-sql-mysql:amd64                4:4.8.2+dfsg-11         amd64                   Qt 4 MySQL database driver
ii  mysql-client-5.6                      5.6.16-1~exp1           amd64                   MySQL database client binaries
ii  mysql-client-core-5.6                 5.6.16-1~exp1           amd64                   MySQL database core client binaries
ii  mysql-common                          5.5.35+dfsg-0+wheezy1   all                     MySQL database common files, e.g. /etc/mysql/my.cnf
ii  mysql-common-5.6                      5.6.16-1~exp1           all                     MySQL 5.6 specific common files, e.g. /etc/mysql/conf.d/my-5.6.cnf
ii  mysql-server-5.6                      5.6.16-1~exp1           amd64                   MySQL database server binaries and system database setup
ii  mysql-server-core-5.6                 5.6.16-1~exp1           amd64                   MySQL database server binaries
ii  python-mysqldb                        1.2.3-2                 amd64                   Python interface to MySQL

Вот разбивка шагов.

  1. Если у вас установлен какой-либо из пакетов wheezy MySQL 5.5, удалите их, они вызовут проблемы только позже. Если есть какие-либо пакеты, которые зависят от них, им тоже придется уйти.
  2. Во-первых, найдите источники. Вам необходимо добавить следующее (или подобное, с учетом предпочтительного сервера) в /etc/apt/sources.list :

     deb-src http: //debian.lcs .mit.edu / debian / experimental main non-free contrib 
     
  3. Также добавьте следующее в / etc / apt / preferences .

     Пакет: * 
    PIN-код: выпуск a = экспериментальный 
    Pin-Priority: 1 
     
  4. Затем запустите

     apt-get update 
     
  5. Затем запустите

     apt-get source mysql-5.6 
     

    в каком-нибудь подходящем каталоге. Обычно я создаю каталог в / usr / local / src ,
    в этом случае, скажем, / usr / local / src / mysql .

  6. Затем перейдите в / usr / local / src / mysql .

  7. Запустите

     sudo apt-get build-dep mysql-5.6 
     

    На моем компьютере была установлена ​​пара пакетов.

  8. Установите несколько базовых пакетов для сборки.

     apt-get install build-essential devscripts fakeroot 
     

    Затем перейдите в каталог с исходным кодом /usr/local/src/mysql/mysql-5.6 - 5.6. 16 и запустите

     debuild -uc -us 
     

    Сборка займет некоторое время. В некоторых случаях рекомендуется увеличивать
    номер версии на единицу, но здесь в этом нет необходимости. поскольку маловероятно, что какой-либо другой пакет MySQL 5.6 попадет в хриплый язык.

    Если вы не хотите запускать тесты, вы можете вместо этого использовать

     DEB_BUILD_OPTIONS = "nocheck" debuild -uc -us 
     
  9. Теперь вы должны установить libdbd- mysql-perl, который является зависимостью от пакетов mysql во время выполнения.

      apt-get install libdbd-mysql-perl 
     
  10. Затем перейдите на один уровень вверх до / usr / local / src / mysql . Там должно быть несколько пакетов deb . Вам нужно установить как минимум

      mysql-client-core-5.6_5.6.16-1 ~ exp1_amd64.deb 
    mysql-common-5.6_5.6.16-1 ~ exp1_all.deb {{1} } mysql-server-5.6_5.6.16-1 ~ exp1_amd64.deb 
    mysql-client-5.6_5.6.16-1 ~ exp1_amd64.deb 
    mysql-server-core-5.6_5.6.16- 1 ~ exp1_amd64.deb 
     

    Это можно сделать, например, запустив:

      dpkg -i mysql-client-core-5.6_5.6.16-1 ~ exp1_amd64.deb 
    mysql -common-5.6_5.6.16-1 ~ exp1_all.deb 
    mysql-server-5.6_5.6.16-1 ~ exp1_amd64.deb 
    mysql-client-5.6_5.6.16-1 ~ exp1_amd64. deb 
    mysql-server-core-5.6_5.6.16-1 ~ exp1_amd64.deb 
     
1
08.02.2019, 05:16
2 ответа

$fooне является массивом; это строка, содержащая несколько слов, разделенных пробелом -. Если вы хотите, чтобы это был массив, назначьте его как один:

foo=( $(grep 'select' file.txt | tail -n 1) )

Теперь вы можете ссылаться на ${foo[0]}или первые три элемента как ${foo[@]:0:3}.

Обратите внимание, что ${foo[@]}будет содержать все пять элементов из вашей последней совпадающей строки, поскольку здесь нет ничего, что могло бы извлечь только первые три элемента. Вы можете использовать foo=("${foo[@]:0:3}"), чтобы сократить ${foo[@]}до нужного размера, если хотите.

В качестве альтернативы,если вы хотите создать массив только из первых трех элементов, вы можете использовать awkвот так:

foo=( $(awk '/select/ { a=$1; b=$2; c=$3 } END { print a,b,c }' file.txt) )
3
27.01.2020, 23:18

Это позволяет избежать чтения данных в переменные:

$ grep -F select file | tail -n 1 | cut -d ' ' -f 1-3
0.47331 5.11188 13.1615

Чтобы получить значения в массив в bash, используйтеmapfile(илиreadarray):

$ mapfile -t arr < <( grep -F select file | tail -n 1 | cut -d ' ' -f 1-3 | tr ' ' '\n' )
$ printf 'arr: %s\n' "${arr[@]}"
arr: 0.47331
arr: 5.11188
arr: 13.1615

Я использую tr, чтобы заменить пробелы между числами символами новой строки. Таким образом, я не получаю завершающий символ новой строки в конце последнего значения в массиве.


Вместо неудобного конвейера grep+ tail+ cut+ trвы, очевидно, могли бы использовать

awk '/select/ { a=$1; b=$2; c=$3 } END { printf("%s\n%s\n%s\n", a, b, c) }'

или что-то подобное внутри подстановки процесса <(...).

1
27.01.2020, 23:18

Теги

Похожие вопросы