「テール」へのパイピングが行の内容を変更するのはなぜですか?


14

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


別のコマンドをパイプ処理しても同じ出力が得られますよね?たとえば、mysql ... | headまたはmysql ... | grep 8
テルドン

英語力を向上させてくれてありがとう。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またはheadで同じ問題を抱えています
-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ではなく、配管です。

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 ヘッダー行を削除します。

1
オプションは-r --column-names=0私の問題を解決しました、戦車
FaxMax

3
これは、ls出力が端末に送られるときに出力が列に入れられるのと同じ理由ですが、パイプまたはファイルに書き込むときは単一の列です。
バーマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.