너무 많은 필드를 반환하는 MySQL SELECT를 터미널에 가장 잘 표시하는 방법은 무엇입니까?


271

PuTTY 를 사용 하여 실행 중입니다.

mysql> SELECT * FROM sometable;

sometable많은 필드가 있으며 이로 인해 많은 열이 터미널에 표시됩니다. 필드는 다음 줄로 줄 바꿈되므로 열 제목을 필드 값으로 정렬하기가 매우 어렵습니다.

터미널에서 이러한 데이터를 볼 수있는 솔루션은 무엇입니까?

phpMyAdmin 또는 다른 GUI 인터페이스에 액세스하고 싶지 않습니다. 다음과 같은 명령 줄 솔루션을 찾고 있습니다. MySQL Query 결과를 텍스트 또는 CVS 파일로 저장


해결책은 개발자가 터미널이 단일 화면보다 더 넓어지지 않도록하는 버그를 수정하는 것입니다.
Owl

@Owl, 이것이 정말로 버그입니까? 여기에 제공된 솔루션으로 아직 문제가 해결되지 않았습니까?
Gathide

답변:


531

\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
          ...

9
Windows는 대소 문자를 구분하지 않지만 대문자로 입력 G해야합니다.
Rafael Barros

3
위의 설명을 명확히하기 위해 입력 SELECT * FROM sometable\G할 때 Windows가 아닌 mysql 명령 줄 클라이언트에 문자열을 보내고 있으므로 G대소 문자를 구분합니다.
Hurricane Hamilton

2
대량의 레코드로는 잘 작동하지 않는 한.
Błażej Michalik

1
링크 된 문서에는 "ego (\ G) 명령을 mysql 서버로 보내고 결과를 세로로 표시합니다. 다른 말로 발생할 수있는 구분 기호를 정의하는 데주의하십시오. 예를 들어 구분 기호를 X로 정의하면 구분 기호를 X로 정의 할 수 없습니다. INDEX라는 단어를 문장에 사용하십시오. "
Benjamin

나는 이것을 만났다. 문제를 해결하는 방법을 알려주시겠습니까? sh: 1: less: not found 44 rows in set (0.01 sec)
Quy Tang

347

이 기능이 유용 할 수도 있습니다 (Windows 이외의 경우 만 해당).

mysql> pager less -SFX
mysql> SELECT * FROM sometable;

이렇게하면 less명령 행 도구를 통해 출력을 파이프하고, 이 매개 변수를 사용하면 커서 키를 사용하여 가로 및 세로로 스크롤 할 수있는 테이블 형식 출력이 제공됩니다.

도구 q를 종료 할 키를 누르면 이보기를 그대로 둡니다 less.


23
이것은 천재입니다. 훌륭한 팁. 새벽 이래로 나는 이것을 원했다.
Richard H

60
nopager를 사용하여 재설정 할 수 있습니다.
epeleg

3
/검색하면 검색 문자열을 입력 한 다음 정규식이 될 수있는 검색 문자열을 작성한 다음 enter 키를 누릅니다. ( ) n를 눌러 앞뒤로 검색하십시오 . NShift + n
Krøllebølle

5
less더 멋진 일을 할 수 있습니다. 를 사용 &하면 정규식을 사용하여 결과를 더 필터링 할 수 있습니다 (일치하는 줄만 표시). /검색 과 함께 작동합니다 (여전히 강조 표시가 발생 함). 다시 한 &번 누른 다음 Return 키를 눌러 필터를 재설정하십시오 .
Daniel Schneller

3
출력이 이미 화면에 맞으면 F가 즉시 종료됩니다. X는 종료시 화면을 지우려고하지 않도록합니다. 적은 매뉴얼 페이지를 참조하십시오.
Daniel Schneller

46

\G다음 대신 쿼리를 실행 하여 수직 모드를 활성화하십시오 ;.

mysql> SELECT * FROM sometable \G

결과는 세로 모드로 표시되므로 각 열 값이 별도의 줄에 인쇄됩니다. 출력은 더 좁지 만 분명히 더 길어질 것입니다.


2
의 보완으로 \G, 당신은 또한 누가 그것을 할 것인지에 \g대한 대체물로 사용할 수 있습니다 . ;\G
santiago arizti

25

사용 mysqlego명령을

에서 mysqlhelp명령

ego (\ G) mysql 서버에 명령을 보내고 결과를 세로로 표시합니다.

추가로 그래서 \G당신을을 select, 당신은 매우 깨끗 수직 출력을 얻을 수 있습니다 :

mysql> SELECT * FROM sometable \G

호출기 사용

MySQL에게 넓은 라인을 자르고 화살표 키로 스크롤 할 수있는 출력을 제공 less하는 -S옵션 과 함께 페이저 를 사용하도록 지시 할 수 있습니다.

mysql> pager less -S

따라서 다음에 넓은 출력으로 명령을 실행하면 MySQL에서 less호출기로 출력을 찾아 볼 수 있습니다 .

mysql> SELECT * FROM sometable;

호출기로 작업을 마치고 일반 출력 on으로 돌아가려면 다음을 stdout사용하십시오.

mysql> nopager

2
이! 이것을 더 완벽하게 만드는 아름답고 유일한 방법은 기둥이 수평으로 얼마나 멀리 뻗어 있는지 볼 수있는 방법입니다. 스크롤바처럼. 그럼에도 불구하고 훌륭한 솔루션입니다.
Brandon Benefield

24

--table또는 -t옵션을 사용하면 멋진 결과 집합이 출력됩니다.

echo 'desc table_name' | mysql -uroot database -t

또는 mysql에 쿼리를 전달하는 다른 방법 :

mysql -uroot table_name --table < /tmp/somequery.sql

산출:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| username     | varchar(30)  | NO   | UNI | NULL    |                |
| first_name   | varchar(30)  | NO   |     | NULL    |                |
| last_name    | varchar(30)  | NO   |     | NULL    |                |
| email        | varchar(75)  | NO   |     | NULL    |                |
| password     | varchar(128) | NO   |     | NULL    |                |
| is_staff     | tinyint(1)   | NO   |     | NULL    |                |
| is_active    | tinyint(1)   | NO   |     | NULL    |                |
| is_superuser | tinyint(1)   | NO   |     | NULL    |                |
| last_login   | datetime     | NO   |     | NULL    |                |
| date_joined  | datetime     | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

8

기본 호출기는 stdout입니다. 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>

출력이 완료되지 않았습니다. 내용이 화면에 맞습니다.

두 번째 것 :

vim 모드를 설정하여 .vimrc에 넣으십시오.

  ~  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
+-----------+------------+------------+-------------+-------------+----------
~
~
~

이것은 경량 도커 컨테이너에서 가장 효과적이었습니다. pager cut -c -200. 여기에서 더 많은 대답을 얻으려면 불필요한 종속성을 다운로드해야했습니다.
Gabriel Gates

7

가장 잘 생각한 답변을 보완하기 위해 less -SFX다른 방법으로 도 사용 .my.cnf합니다. 홈 폴더의 파일에 광고를 게재하고 싶습니다 .cnf 파일의 예는 다음과 같습니다.

[client]
user=root
password=MyPwD
[mysql]
pager='less -SFX'

이 방법으로 얻는 좋은 점은 less쿼리 출력이 실제로 두 페이지 이상인 경우에만 사용 된다는 것 입니다. 여기에는 모든 플래그에 대한 설명이 있습니다.

  • -S : 한 줄, 줄이 화면보다 넓은 경우 줄을 건너 뛰지 말고 오른쪽으로 스크롤하십시오.
  • -F : 하나의 화면 이면 내용을 스크롤 할 필요가 없으면 stdout으로 보내십시오.
  • -X : 초기화 안 됨, 모든 출력을 비활성화합니다. "less"는로드 할 때마다 출력하도록 구성했을 수 있습니다.

참고 : .my.cnf파일 pager에서 [client]키워드 아래에 명령을 넣지 마십시오 . mysql잘 작동하지만 mysqldump인식하지 못하는 것에 대해 불평합니다.


큰 테이블에서 "제한없는"쿼리를 실행 less하면 출력의 첫 번째 줄에 고정되어 있기 때문에 그로 인한 혼돈을 알 수 없습니다 .
santiago arizti

2

대화식으로 MySQL을 사용하는 경우 다음 sed과 같이 사용하도록 호출기를 설정할 수 있습니다 .

$ 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"

sed호출기로 사용하지 않으면 출력은 다음과 같습니다.

"blah":"blah","blah":"blah","blah":"blah"

1

나는 썼다-https pspg: //github.com/okbob/pspg

이 호출기는 테이블 형식 데이터 용으로 설계되었으며 MySQL도 지원됩니다.

MariaDB [sakila]> 호출기 pspg -s 14 -X --force-uniborder --quit-if-one-screen
PAGER가 'pspg -s 14 -X --force-uniborder --quit-if-one-screen'으로 설정되었습니다.
MariaDB [sakila]> 지금 선택 ();
MariaDB [sakila]> select * from nicer_but_slower_film_list 한도 100;

0

퍼티에는 창에 지정할 수있는 최대 열 수가 있다고 생각합니다.

Windows의 경우 개인적으로 Windows PowerShell을 사용하고 화면 버퍼 너비를 합리적으로 높게 설정합니다. 열 너비는 고정되어 있으며 가로 스크롤 막대를 사용하여 데이터를 볼 수 있습니다. 나는 당신이 지금 겪고있는 것과 같은 문제가있었습니다.

편집 : SSH로 연결 해야하는 원격 호스트의 경우 plink + Windows PowerShell과 같은 것을 사용합니다



-1

Windows 명령 프롬프트를 사용하면 열 수를 보려는만큼 창의 버퍼 크기를 늘릴 수 있습니다. 이것은 테이블의 열 수에 따라 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.