'Kuyruğa' borulama neden bir satırın içeriğini değiştiriyor?


14

SELECTMySQL Workbench ile bir sonucunu görüntülediğimde, tek bir \

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: ~$ 

Bu seçenekleri var my.cnf:

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

Sonucu iletmek neden tailçıktı / dizgeyi değiştiriyor? (çifte dikkat edin \).


Başka bir komuttan geçerseniz aynı çıktıyı alırsınız değil mi? Örneğin mysql ... | headveya mysql ... | grep 8?
terdon

İngilizcemi geliştirdiğiniz için teşekkürler. headve grep 802ayrıca * \ * 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

hangi kuyruğu kullanıyorsun Eğer çıktısını paylaşabilirtail --version
amisax

@ amisax benim kuyruğum tail (GNU coreutils) 8.23ama grep veya kafa ile aynı sorunu var
FaxMax

benim bash GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)ve uname -asonuçları:Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26) x86_64 GNU/Linux
FaxMax

Yanıtlar:


32

Bu değil tail, borular.

mysqlstdout'u bir kullanıcı için tasarlandığında bir terminal aygıtı olduğunda ASCII boks çıkış biçimine sahip bir tablo kullanır ve bir boru veya normal bir dosya gibi, komut dosyası biçimine dönmez .

Aynı görürdük farklı olan biçimi

mysql... | cat

veya

mysql > file; cat file

Ayrıca bkz -r/ --raw, -s/ --silent, -B/ --batch, -N/ --skip-column-names/ --column-names=0, -H/ --html, -t/ --table... çıkış biçimini etkiler söyledi.

Çıktı bir terminal aygıtına gitmediğinde bile tablo çıkışının olmasını istiyorsanız, -tseçeneği ekleyin :

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

Ancak mesele başlık satırını kaldırmaksa, sadece olsun -Nveya olmasın kullanın -t.

Veritabanından değerleri olabildiğince ham ve üstbilgisiz almak için burada kullanacağım:

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

Yani:

  • pskimlik bilgilerini bir dosyaya (sizin gibi my.cnf) geçirerek çıktıdaki parolayı açığa çıkarmayın --defaults-extra-file.
  • tablo çıkışından kaçınmak için toplu modunu kullanın (ve aslında başka sonuçları olabilecek toplu olarak işlediğimizi kabul edin).
  • --rawkaçmayı önlemek için . Değerlerin yeni satır içermediği varsayılır, aksi takdirde çıktı güvenilir bir şekilde sonradan işlenemez.
  • --skip-column-names başlık satırını kaldırmak için.

1
seçenekler -r --column-names=0sorunumu çözdü, tanklar
FaxMax

3
Bu, lsçıktı bir terminale gittiğinde çıkışın sütunlara konmasının nedenidir , ancak bir boruya veya dosyaya yazarken tek bir sütundur.
Barmar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.