`mysql` を 'tail' にパイプすると出力形式が変わるのはなぜですか?

`mysql` を 'tail' にパイプすると出力形式が変わるのはなぜですか?

SELECTMySQL Workbenchでの結果を見ると、1つだけで正しいことがわかります。\

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出力/文字列が変わるのはなぜですか? (二重の に注意してください\)。

答え1

違いますtail、配管の問題です。

mysql標準出力が端末デバイスの場合、ユーザー向けの場合は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ヘッダー行を削除します。

関連情報