क्यों पाइप कमांड "एल | गलत "1" गलत परिणाम मिलता है?


13

जैसा कि चित्र दिखाता है, मैं lवर्तमान फ़ोल्डर में फ़ाइल प्राप्त करने के लिए उपयोग करता हूं । और फिर मैं फ़ाइल को नंबर के साथ प्राप्त करना चाहता हूं 1, इसलिए मैं pipeऔर का उपयोग करता हूं grep

लेकिन फाइल 2और 22फाइल बाहर क्यों दिखा? और क्या है 1;34m?

$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22

अपडेट करें

मैंने पहले ही lअपनी zshrcफ़ाइल में कमांड को उर्फ कर दिया है ।

 alias lsp="ls"
 alias ll='ls -alF'
 alias la='ls -A'
 alias l='ls -CF'
 alias ls="ls -alh --color"

और यहाँ typeआदेश का परिणाम है :

>$ type ls
ls is an alias for ls -alh --color

> $ type l
l is an alias for ls -CF

4
कृपया पाठ के स्क्रीनशॉट पोस्ट न करें। यहां टेक्स्ट कॉपी करें और कोड फॉर्मेटिंग लागू करें।
मुरु

@ मुझे लगता है कि आप पोस्ट आउटपुट पूछना type -a lचाहते हैं?
विनयुनुच्स 2 यूनिक्स

@ WinEunuuchs2Unix आह, हाँ।
मुरु

@ क्या मैं आपसे type lsकमांड का आउटपुट पोस्ट करने के लिए कह सकता हूं ? क्या आपने lsकिसी भी तरह से उपनाम बदल दिया है ?
सर्गी कोलोडियाज़नी

@Serg पहले से ही अपडेट किया गया है।
ली

जवाबों:


27

सबसे पहले, आप जो करने की कोशिश कर रहे हैं, l| grep <filename>वह खराब है। यह मत करो। यहाँ पर क्यों।

l कमांड वास्तव में एक उपनाम है ls -CF

$ type -a l
l is aliased to `ls -CF'

उबंटू के डिफ़ॉल्ट रूप से bash, lsएक उपनाम है ls --color=auto। जैसा कि स्टीलड्राइवर ने टिप्पणी में बताया है कि कलराइजेशन --color=autoबंद करना है। आपके विशिष्ट मामले में, आपके पास alias ls="ls -alh --color"और alias l="ls -CF", जो मूल रूप से समाप्त हो रहा है ls -alh --color -CF। स्विच का यह विशेष संयोजन अभी भी एक पाइप पर रंगीन आउटपुट भेजता है। उदाहरण के लिए:

$ ls -alh --color -CF ~/TESTDIR | cat -A                                                                                 
^[[0m^[[01;34m.^[[0m/  ^[[01;34m..^[[0m/  1.txt  2.txt  3.txt  out.txt$

ध्यान दें कि कैसे .और ..निर्देशिका में एक ही सीक्वेंस हैं।

इस सबका क्या मतलब है

इसका मतलब है कि lफ़ाइल प्रकार के अनुसार फाइलों की रंगीन सूची को आउटपुट करेगा। समस्या यह है कि पलायन दृश्यों के उपयोग के साथ रंगीकरण होता है । यही 1:34mचीजें हैं - वे विशिष्ट रंगों के लिए भागने का क्रम हैं।

मुख्य समस्या यह है कि पार्सिंग lsअक्सर स्क्रिप्ट में गलत आउटपुट और आपदाओं की ओर ले जाता है, बस इसलिए lsकि पहले और अन्य विशेष वर्णों की तरह बच दृश्यों की अनुमति देता है। अधिक जानकारी के लिए यह लेख देखें: http://mywiki.wooledge.org/ParsingLs

आपको क्या करना चाहिए:

findकमांड का उपयोग करें :

bash-4.3$ ls
1.txt  2.txt  3.txt  out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt

आप शेल ग्लोब और आधुनिक परीक्षण [[कमांड के साथ ऐसा कुछ कर सकते हैं :

bash-4.3$ for file in * ;do if [[ "$file" =~ "1"  ]] ;then echo "$file" ;fi ; done
1.txt

या हो सकता है कि अजगर का उपयोग करें, जिसमें bashअकेले की तुलना में बेहतर फ़ाइल नाम हैंडलिंग क्षमता है

bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']

अगर वहाँ के उत्पादन की प्रक्रिया की जरूरत नहीं है ls, सरल गोलाबारी के साथ lsभी काम कर सकते हैं। (याद रखें, यह केवल फाइलों की सूची देखने के लिए है, आउटपुट टेक्स्ट से निपटने के लिए इसे किसी अन्य प्रोग्राम में पास करने के लिए नहीं)

bash-4.3$ ls *1*
1.txt

2
मुझे लगता है कि आउटपुट को केवल एक पाइप में रंगा जाएगा यदि --color=alwaysयह भी निर्दिष्ट किया गया है - या तो खुद के लिए lया पिछले उपनाम में ls(डिफ़ॉल्ट को प्रतिस्थापित करने के लिए alias ls='ls --color=auto') उपनाम के हिस्से के रूप में ।
स्टीलड्राइवर

@steeldriver अच्छा बिंदु है, लेकिन क्या lsयह डिफ़ॉल्ट रूप से नहीं है? type lsमुझे देता है कि यह एक उर्फ ​​हैls --color=auto
सर्गी कोलोडाज़नी 4

1
हां यह डिफ़ॉल्ट है - लेकिन autoAFAIK में एक पाइप से रंग बंद हो जाता है। एएनएसआई रंग दृश्यों को देखने के लिए, यह करने के लिए बदल गया होगा --color=alwaysया तो में, lsउपनाम या lअन्य नाम
steeldriver

ओह, मैं समझता हूं कि तुम्हारा क्या मतलब है। यह बहुत अजीब है।
सर्गी कोलोडियाज़नी

@steeldriver तो मैंने ओपी से अपने उपनामों को पोस्ट करने का अनुरोध किया, और जाहिर है कि उनके पास, अर्थात् ls --color, रंगीकरण को रोका नहीं गया (परीक्षण किया गया कि खुद को भी)। तदनुसार मेरे उत्तर को अपडेट करें
सेर्गेई कोलोडियाज़नी

6

आपके lऔर lsआदेश उपनाम के रूप में सेटअप हैं।

जब आप उन्हें आउटपुट स्क्रीन के माध्यम से पाइपिंग चलाते हैं grep "1"( |जहां) 1दिखाई देने वाली प्रत्येक स्क्रीन लाइन को 1रंगीन लाल रंग के साथ प्रदर्शित किया जाता है ।

क्योंकि फ़ाइल नाम ., .., 2और 22एक ही स्क्रीन लाइन पर दिखाई देते हैं, वे से उत्पादन कर रहे हैं grepऔर साथ ही लेकिन लाल जो शो में दिखाई नहीं देते grepमैचों।

:34mएक रंग है जो ठीक से रंग नहीं करता है के लिए एक भागने अनुक्रम है। के आउटपुट के साथ आपके संशोधित प्रश्न के आधार पर type -a lऔर type -aइसे मेरे सिस्टम में पुन: प्रस्तुत किया जा सकता है। कृपया ध्यान दें कि आप से अपना उपनाम परिवर्तित करना चाहिए --colorकरने के लिए --color=auto:

रंग का उत्पादन

रंग एल.एस.


1:34mबातें, भ्रष्टाचार नहीं कर रहे हैं वे भागने पाठ की colorization के लिए इस्तेमाल किया दृश्यों। उस भाग पर मेरा उत्तर देखिए;)
सर्गीय कोलोडियाज़नी

@ शेर शुक्रिया। मैंने एलियास के साथ ओपी संशोधित प्रश्न पर आधारित संशोधन किया है।
विनयुनुच्स 2 यूनिक्स

1

आपके परीक्षण में, आप अपने lsउपनाम को बुला रहे थे , इस प्रकार 1;34mऔर इसी तरह का शोर जो रंग से आता है, और चूंकि पाइप |एक ही लाइन पर यह सब प्राप्त करता है, उस रेखा से grepफ़ाइल 1से मेल खाता है और परिणामस्वरूप इस रेखा को प्रिंट करता है। यह आप स्क्रीन पर देख रहे हैं।

जब आप उस तरह से सामान कर रहे होते हैं, तो सिस्टम कमांड पर प्रति पंक्ति 1 परिणाम के साथ वापस जाना हमेशा अच्छा होता है।

उपनामों से छुटकारा पाने के लिए \ls, और -1लाइन फीड द्वारा अलग किए गए परिणामों को प्रिंट करने के विकल्प का उपयोग करें ।

$ \ls -1 | grep "1"
1
11

नोट: बैकस्लैश मेथड हर कमांड के साथ काम करता है, \commandबस बिना सिस्टम वाले कमांड को कॉल करता है।

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