Как записать набор результатов MySQL в массив bash?

Использование Zip

Если вы действительно хотите застегнуть дерево каталогов, вы можете использовать инструмент zip следующим образом:

$ zip -r archive.zip *

Пример

С образцом каталога я бы получил следующее в . zip файл:

$ unzip -l archive.zip 
Archive:  archive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  10-30-2013 15:26   1/
        0  10-30-2013 15:26   1/afile
        0  10-30-2013 15:26   2/
        0  10-30-2013 15:26   2/afile
        0  10-30-2013 15:26   3/
        0  10-30-2013 15:26   3/afile
        0  10-30-2013 15:26   4/
        0  10-30-2013 15:26   4/afile
---------                     -------
        0                     8 files

Использование Tar

Если вы хотите выполнить вышеописанное, используя tar и gzip полученный .tar файл после этого, вы можете использовать одну команду:

$ tar zcvf archive.tar.gz *

Пример

С примером каталога я бы получил следующее в файле .tar.gz:

$ tar ztvf archive.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-30 15:26 1/
-rw-rw-r-- saml/saml         0 2013-10-30 15:26 1/afile
drwxrwxr-x saml/saml         0 2013-10-30 15:26 2/
-rw-rw-r-- saml/saml         0 2013-10-30 15:26 2/afile
drwxrwxr-x saml/saml         0 2013-10-30 15:26 3/
-rw-rw-r-- saml/saml         0 2013-10-30 15:26 3/afile
drwxrwxr-x saml/saml         0 2013-10-30 15:26 4/
-rw-rw-r-- saml/saml         0 2013-10-30 15:26 4/afile
8
03.06.2018, 14:16
3 ответа

Si desea la cantidad de líneas en un archivo, que será igual a la cantidad de filas devueltas de la consulta, simplemente use wcpara contar la cantidad de líneas en el archivo

  arraylength=$( wc -l < /tmp/query.csv)
  echo $arraylength
1
27.01.2020, 20:11

Con la opción--batch, mysqldebería generar el resultado un registro en una línea y columnas separadas por tabulaciones. Puede leer las líneas en una matriz con Bash'smapfiley procesar la sustitución, o ordenar la sustitución y la asignación de matriz:

mapfile results  < <( mysql --batch... < query.sql )

o

set -f        # disable globbing
IFS=$'\n'     # set field separator to NL (only)
results=( $(mysql --batch... ) )

(Tenga en cuenta que IFSpermanece modificado y globbing deshabilitado después de esto.)

Luego, si desea dividir las columnas de una fila en algunas variables:

IFS=$'\t' read -r col1 col2 col2... <<< "${results[0]}"

Su tarea

linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`

no es una asignación de matriz (, falta el paréntesis ). Simplemente asigna la salida de la sustitución del comando a una variable de cadena regular. (Cualquier salto de línea se incrustará allí, pero seguirá siendo una sola cadena.)${#linesIN[@]}todavía funciona ya que en Bash/ksh las matrices de elementos individuales -y las variables escalares actúan de la misma manera.

14
27.01.2020, 20:11

Otra forma de hacerlo sería canalizar la salida del comando a un bucle while. Tenga en cuenta que desea incluir el -N o los resultados incluyen el nombre de la columna.

#!/bin/bash
#Script to read output from a mysql command line by line 

mysql -uroot -p example -N -e "select column from table" | while IFS= read -r loop
do
    echo "$loop"
done 

Y si solo quiere un conteo, haría un select count(columnName)e imprimiría los resultados.

6
27.01.2020, 20:11

Теги

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