왜 '꼬리'로 파이핑하여 라인의 내용을 변경합니까?


14

SELECTMySQL Workbench 에서 결과를 볼 때 하나의 \

max@host 10:13:58: ~$ mysql -h db-master.domain.local -uuser -ppw db -e '
>                 SELECT
>                 DISTINCT i.filesourceregexp
>                 FROM db.ImportLogFiles i'

+------------------------------------------------+
| filesourceregexp                               |
+------------------------------------------------+
| ^[0-9]{8}_1062355673_merge_google_pbn\.csv$    |
| ^[0-9]{8}_8026062435_merge_google_pbn\.csv$    |
| ^[0-9]{8}_1062355673_store_visits_report\.csv$ |
+------------------------------------------------+

max@host 10:14:10: ~$ mysql -h db-master.domain.local -uuser -ppw db -e '
                SELECT
                DISTINCT i.filesourceregexp
                FROM db.ImportLogFiles i' | tail -n +2
^[0-9]{8}_1062355673_merge_google_pbn\\.csv$
^[0-9]{8}_8026062435_merge_google_pbn\\.csv$
^[0-9]{8}_1062355673_store_visits_report\\.csv$
max@host 10:14:19: ~$ 

이 옵션은 다음과 my.cnf같습니다.

[client] 
host = db-master 
user = user 
password = pass 
default-character-set=utf8

결과를 파이핑하여 tail출력 / 문자열 을 변경하는 이유는 무엇 입니까? (더블 참고 \).


다른 명령을 통해 파이프하면 동일한 출력을 얻습니다. 예를 들어 mysql ... | head또는 mysql ... | grep 8?
terdon

영어 실력을 향상시켜 주셔서 감사합니다. head그리고 grep 802또한 두 배로 않습니다 * \ * max@host 10:50:48: ~$ mysql -V mysql Ver 14.14 Distrib 5.5.55, for debian-linux-gnu (x86_64) using readline 6.3
FaxMax

어떤 꼬리를 사용하고 있습니까? 당신의 출력을 공유 할 수 있습니다tail --version
amisax

@amisax 내 꼬리는 tail (GNU coreutils) 8.23있지만 grep 또는 머리와 같은 문제가 있습니다
FaxMax

내 bash는 다음 GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)uname -a같습니다 :Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

답변:


32

tail배관 이 아닙니다 .

mysqlstdout이 터미널 장치 인 경우 ASCII 복싱 출력 형식의 표 형식을 사용합니다 (사용자 용) . 파이프 나 일반 파일 인 경우와 같이 스크립트 형식이 아닌 경우 스크립팅 형식으로 되돌 립니다.

당신은 같은 다른 형식을 볼 수 있습니다

mysql... | cat

또는

mysql > file; cat file

출력 형식에 영향을주는 -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0, -H/ --html, -t/ --table... 도 참조하십시오 .

출력이 터미널 장치로 이동하지 않더라도 테이블 형식 출력을 원하면 다음 -t옵션을 추가하십시오 .

mysql -t ... | tail -n +2

그러나 요점이 헤더 행을 제거하는 것이라면을 사용 -N하거나 사용하지 않고을 사용하십시오 -t.

가능한 한 원시 데이터베이스에서 헤더없이 값을 얻으려면 다음을 사용하십시오.

mysql --defaults-extra-file=/some/protected/file/with/credentials \
      --batch --raw --skip-column-names -e 'select...' database

그건:

  • ps대신 (자신과 같이 my.cnf) 파일에 자격 증명을 전달 하여 출력에 비밀번호를 노출시키지 마십시오 --defaults-extra-file.
  • 배치 모드를 사용하여 테이블 형식의 출력을 피하십시오 (실제로 다른 의미를 가질 수있는 배치를 처리한다는 사실을 인정하십시오).
  • --raw탈출 을 피하기 위해 . 값에 개행 문자가 포함되어 있지 않다고 가정하면 출력을 안정적으로 후 처리 할 수 ​​없습니다.
  • --skip-column-names 헤더 행을 제거하십시오.

1
옵션은 -r --column-names=0내 문제 탱크를 해결
FaxMax

3
이는 ls출력이 터미널로 갈 때 출력이 열에 들어가는 것과 같은 이유 이지만 파이프 나 파일에 쓸 때 단일 열입니다.
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.