如何在终端中最好地显示返回过多字段的MySQL SELECT?

如何在终端中最好地显示返回过多字段的MySQL SELECT?,mysql,command-line,select,putty,Mysql,Command Line,Select,Putty,我过去经常跑步: sometable有许多字段,这导致许多列试图显示在终端中。字段环绕到下一行,因此很难将列标题与字段值对齐 在终端中查看此类数据有哪些解决方案? 我没有也不想访问phpMyAdmin或任何其他GUI界面。我正在寻找这样的命令行解决方案:用\G代替终止查询。例如: SELECT * FROM sometable\G 此查询垂直显示行,如下所示: *************************** 1. row ***************************

我过去经常跑步:

sometable
有许多字段,这导致许多列试图显示在终端中。字段环绕到下一行,因此很难将列标题与字段值对齐

在终端中查看此类数据有哪些解决方案?


我没有也不想访问phpMyAdmin或任何其他GUI界面。我正在寻找这样的命令行解决方案:

\G
代替
终止查询。例如:

SELECT * FROM sometable\G
此查询垂直显示行,如下所示:

*************************** 1. row ***************************
                 Host: localhost
                   Db: mydatabase1
                 User: myuser1
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
*************************** 2. row ***************************
                 Host: localhost
                   Db: mydatabase2
                 User: myuser2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
$ mysql -u <user> p<password>
mysql> pager sed 's/,/\n/g' 
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah 
.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"
"blah":"blah","blah":"blah","blah":"blah"
[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'

尝试启用垂直模式,使用
\G
执行查询,而不是

mysql> SELECT * FROM sometable \G

您的结果将以垂直模式列出,因此每列值将打印在单独的行上。输出将更窄,但显然要长得多。

我相信putty具有可以为窗口指定的最大列数

对于Windows,我个人使用Windows PowerShell,并将屏幕缓冲区宽度设置得相当高。列宽保持不变,您可以使用水平滚动条查看数据。我有和你现在一样的问题


编辑:对于您必须通过SSH连接到的远程主机,您可能会使用类似于plink+Windows PowerShell的东西,您可能会发现这很有用(仅限非Windows):

这将通过
less
命令行工具引导输出,该工具通过这些参数为您提供一个表格输出,可以使用光标键水平和垂直滚动

点击
q
键离开此视图,这将退出
less
工具。

您可以使用
--table
-t
选项,这将输出一组漂亮的结果

echo'desc table_name'| mysql-uroot数据库-t
或者使用其他方法将查询传递给mysql,如:

mysql-uroot table\u name--table
输出:

+--------------+--------------+------+-----+---------+----------------+
|字段|类型|空|键|默认|额外|
+--------------+--------------+------+-----+---------+----------------+
|id | int(11)| NO | PRI | NULL |自动增量|
|用户名| varchar(30)| NO | UNI | NULL ||
|名字| varchar(30)| NO | | NULL ||
|姓氏| varchar(30)| NO | | NULL ||
|电子邮件| varchar(75)|否| |空||
|密码| varchar(128)| NO | | NULL ||
|是工作人员(1)不是空的|
|是否处于活动状态| tinyint(1)|否| |空||
|超级用户是否为tinyint(1)|否| |空||
|上次登录|日期时间|否| |空||
|日期|日期时间|否|空||
+--------------+--------------+------+-----+---------+----------------+

您可以使用
tee
将查询结果写入文件:

tee somepath\filename.txt

使用Windows命令提示符,您可以根据需要增加窗口的缓冲区大小以查看列数。这取决于表中的列数。

如果您以交互方式使用MySQL,可以将寻呼机设置为使用
sed
,如下所示:

*************************** 1. row ***************************
                 Host: localhost
                   Db: mydatabase1
                 User: myuser1
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
*************************** 2. row ***************************
                 Host: localhost
                   Db: mydatabase2
                 User: myuser2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
$ mysql -u <user> p<password>
mysql> pager sed 's/,/\n/g' 
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah 
.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"
"blah":"blah","blah":"blah","blah":"blah"
[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'

默认的寻呼机是stdout。标准输出具有列限制,因此输出将被包装。您可以将其他工具设置为分页器以格式化输出。有两种方法。一个是限制列,另一个是在vim中处理它

第一种方法:

➜  ~  echo $COLUMNS
179

mysql> nopager
PAGER set to stdout
mysql> pager cut -c -179
PAGER set to 'cut -c -179'
mysql> select * from db;
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| Host      | Db         | User       | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
| %         | test       |            | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| %         | test\_%    |            | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| localhost | phpmyadmin | phpmyadmin | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
| localhost | it         | it         | Y           | Y           | Y           | Y           | Y           | Y         | N          | Y               | Y          | Y          |
+-----------+------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-
4 rows in set (0.00 sec)

mysql>
输出不完整。内容适合您的屏幕

第二条:

在.vimrc中将vim模式设置为nowrap

➜  ~  tail ~/.vimrc

" no-wrap for myslq cli
set nowrap

mysql> pager vim -
PAGER set to 'vim -'
mysql> select * from db;
    Vim: Reading from stdin...
+-----------+------------+------------+-------------+-------------+----------
| Host      | Db         | User       | Select_priv | Insert_priv | Update_pr
+-----------+------------+------------+-------------+-------------+----------
| %         | test       |            | Y           | Y           | Y
| %         | test\_%    |            | Y           | Y           | Y
| localhost | phpmyadmin | phpmyadmin | Y           | Y           | Y
| localhost | it         | it         | Y           | Y           | Y
+-----------+------------+------------+-------------+-------------+----------
~
~
~

为了补充我认为最好的答案,我还使用了
less-SFX
,但方式不同:我喜欢将其添加到我的主文件夹中的
.my.cnf
文件中,示例cnf文件如下所示:

*************************** 1. row ***************************
                 Host: localhost
                   Db: mydatabase1
                 User: myuser1
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
*************************** 2. row ***************************
                 Host: localhost
                   Db: mydatabase2
                 User: myuser2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          ...
$ mysql -u <user> p<password>
mysql> pager sed 's/,/\n/g' 
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah 
.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"
"blah":"blah","blah":"blah","blah":"blah"
[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'
这样做的好处是
less
仅在查询的输出实际长度超过一页时使用,以下是所有标志的说明:

  • -S:单行,当行比屏幕宽时不要跳过行,而是允许向右滚动
  • -F:如果有一个屏幕退出,如果内容不需要滚动,只需发送到标准输出即可
  • -X:No init,禁用任何可能配置为每次加载时输出的输出“less”
注意:在
.my.cnf
文件中,不要将
pager
命令放在
[client]
关键字下面;虽然它可能与
mysql
配合得很好,
mysqldump
会抱怨没有识别它。

使用
mysql
ego
命令 从mysql的
help
命令:

ego(\G)向mysql服务器发送命令,垂直显示结果

因此,通过将
\G
添加到
选择
,您可以获得非常清晰的垂直输出:

mysql> SELECT * FROM sometable \G
使用寻呼机 您可以告诉MySQL使用
less
寻呼机及其
-S
选项,该选项可以切掉宽行,并提供一个可以用箭头键滚动的输出:

mysql> pager less -S
因此,下次运行具有宽输出的命令时,MySQL将允许您使用
less
pager浏览输出:

mysql> SELECT * FROM sometable;
如果您已使用完寻呼机,并希望返回到
stdout
上的常规输出,请使用以下命令:

mysql> nopager

我写了
pspg
-

这个页面是为表格数据设计的,MySQL也受支持

MariaDB [sakila]> pager pspg -s 14 -X --force-uniborder --quit-if-one-screen PAGER set to 'pspg -s 14 -X --force-uniborder --quit-if-one-screen' MariaDB [sakila]> select now(); MariaDB [sakila]> select * from nicer_but_slower_film_list limit 100; MariaDB[sakila]>寻呼机pspg-S14-X——强制uniborder——如果一个屏幕 寻呼机设置为'pspg-s14-X--强制uniborder--如果有一个屏幕退出' MariaDB[saki