'पूंछ ’करने के लिए पाइप लाइन की सामग्री को क्यों बदलता है?


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
बजे

आप किस पूंछ का उपयोग कर रहे हैं? आप के उत्पादन में साझा कर सकते हैंtail --version
amisax

@ मेरीसैक्स मेरी पूंछ है, tail (GNU coreutils) 8.23लेकिन मुझे grep या सिर के साथ एक ही समस्या है
फैक्समैक्स

मेरा बैश है 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
फैक्समैक्स

जवाबों:


32

यह नहीं है tail, यह पाइपिंग है।

mysqlASCII बॉक्सिंग आउटपुट फॉर्मेट के साथ एक टेब्युलर का उपयोग करता है जब इसका स्टडआउट एक टर्मिनल डिवाइस होता है, जब यह किसी उपयोगकर्ता के लिए अभिप्रेत होता है, और स्क्रिप्टिंग प्रारूप में तब बदल जाता है , जब यह पाइप या रेगुलर फाइल नहीं होता है।

आप के साथ एक ही अलग प्रारूप देखेंगे

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मेरी समस्या, टैंक हल
फैक्समैक्स

3
यह वही कारण है कि lsआउटपुट को टर्मिनल में रखा जाता है, जब आउटपुट टर्मिनल पर जाता है, लेकिन पाइप या फाइल पर लिखते समय एक ही कॉलम होता है।
बरमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.