बैश में गतिशील रूप से stdout लाइन चौड़ाई ट्रिम


9

हाल ही में, मैं psकमांड के साथ प्रयोग कर रहा हूं , और कभी-कभी लंबे रास्ते अगली पंक्ति (या दो) से चिपक जाते हैं और इसे पढ़ना मुश्किल हो जाता है। मैं psआउटपुट को xवर्णों की संख्या तक सीमित करने के लिए दूसरे प्रोग्राम में पाइप करना चाहता हूं ।

यहाँ मेरे पास अभी तक है, लेकिन यह बहुत सही काम नहीं करता है:

ps aux | cut -c1-$(stty size | cut -d' ' -f2)

$(stty size | cut -d' ' -f2)167 का मूल्यांकन करता है, लेकिन इसके लिए मान्य इनपुट नहीं लगता है cut

क्या बैश में काम करने के लिए इस प्रकार के सिंटैक्स प्राप्त करने का एक तरीका है?


यह काम मेरे लिए। क्या आप कुछ आउटपुट प्रदान कर सकते हैं?
congonglm

गतिशील भाग कहाँ है? आप कुछ शर्तों के लिए एक अलग लंबाई चाहते हैं? ऐसा लगता है कि आप सभी आउटपुट को एक अधिकतम लंबाई तक सीमित करना चाहते हैं

@awk_FTW स्थिति के आधार पर, मेरे पास अलग-अलग विंडो सेटिंग्स हैं। फुलस्क्रीन पर, मेरी चौड़ाई 167 है। लेकिन अन्य आकारों में, मुझे छोटे होने की आवश्यकता होगी। इसलिए मैं आकार प्राप्त करने के लिए ssty को कॉल करना चाहता हूं।
दाल ४

कोशिश करेंtput rmam; ps aux
स्टीफन चेज़ेलस

कुछ गोले पसंद करते हैं zsh, ksh93या bashटर्मिनल चौड़ाई को स्टोर करते हैं$COLUMNS
स्टीफन चेज़लस

जवाबों:


5

निम्नलिखित कार्य:

ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)

यह भी काम करता है:

v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v

समस्या यह प्रतीत होती है कि कार्य sttyकरने के लिए इसके मानक इनपुट पर tty होना आवश्यक है। उपर्युक्त दो दृष्टिकोण इसे हल करते हैं।

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

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)

वास्तव में, यह करता है! यह ठीक वही है जिसकी मुझे तलाश थी। बस जिज्ञासु, आपने टी टीटी को आखिर में क्यों जोड़ा?
दाल

teeजब मैं डिबगिंग कर रहा था तो @lentils उफ़ जोड़ा गया। यह अब चला गया है।
जॉन १०२४

<और 2 का क्या उल्लेख है? मैंने पहले कभी उस संकेतन को नहीं देखा।
दाल

@lentils शेल में, फ़ाइलें क्रमांकित हैं। शून्य मानक इनपुट को संदर्भित करता है, एक मानक आउटपुट को, और दो मानक त्रुटि को। अभिव्यक्ति का <&2मतलब है कि मानक त्रुटि से अपना इनपुट प्राप्त करें।
जॉन 1024

1
sttyटर्मिनल की सेटिंग्स को उसके स्टैडेन पर खोला जाता है (आप stty < /dev/other-ttyउदाहरण के लिए दूसरे टर्मिनल की सेटिंग प्राप्त करने के लिए करते हैं)। तो यह अजीब नहीं है कि यह काम नहीं करेगा अगर इसकी स्टड एक पाइप है या यह <&2काम करता है।
स्टीफन चेजलस

8

कुछ गोले zsh, bashया mkshस्वचालित रूप $COLUMNSसे टर्मिनल की चौड़ाई के लिए चर सेट करते हैं , इसलिए आपको sttyयहां आह्वान करने की आवश्यकता नहीं है।

psI के सभी कार्यान्वयनों ने कोशिश की कि गैर-मानक (बीएसडी-प्रकार) सिंटैक्स का समर्थन टर्मिनल चौड़ाई को खुद से करें। मैं हैरान हूँ तुम्हारा नहीं है। मुझे उम्मीद है कि यह हालांकि COLUMNS पर्यावरण चर की सामग्री को देखेगा ।

तो आप कर सकते हैं:

export COLUMNS; ps aux

अगर नहीं,

ps aux | cut -c"1-$COLUMNS"

आप अपने टर्मिनल को लाइनों को लपेटने के लिए नहीं कह सकते हैं:

tput rmam
ps aux

4

आप psआउटपुट को थोड़ा बेहतर तरीके से संभाल सकते हैं ।

ps --width ${n:-$COLUMNS} ${opts} #set ps terminal width

ps -ww ${opts} #no word wrap

ps -o ${only_interesting_output} ${opts} #trim output

यह psआवश्यक के रूप में अपने विनिर्देशों के लिए अपने उत्पादन को पार्स करने के लिए बताएगा ।

बेशक, यदि आप शब्द लपेट नहीं करते हैं, हालांकि, तो आपको गुम जानकारी की समस्या है। क्या आपको वास्तव में सभी प्रक्रियाओं के लिए इसकी आवश्यकता है? इसे पेजर में खोलें यदि ऐसा है:

ps ww ${opts} | $PAGER

यदि नहीं, तो निर्दिष्ट करें कि आप क्या देखना चाहते हैं:

ps -o args= -p $pid

वैकल्पिक रूप से आप psअपने टर्मिनल के बारे में स्पष्ट रूप से बता सकते हैं --width:

man ps

...

w व्यापक उत्पादन। असीमित चौड़ाई के लिए दो बार इस विकल्प का उपयोग करें।

-w व्यापक उत्पादन। असीमित चौड़ाई के लिए दो बार इस विकल्प का उपयोग करें।

--width n स्क्रीन की चौड़ाई सेट करें।

--widthबिना किसी अतिरिक्त फ़िल्टर या सहायक प्रक्रियाओं को शामिल किए बिना यह चीज़ आपके अनुरोधित चश्मे के लिए बिल्कुल काम करती है (जो संभवतः आपके -auxआउटपुट को और भी अधिक अव्यवस्थित कर देगी )। और $COLUMNSजैसा कि ऊपर दिखाया गया है और जैसा कि स्टीफन बताते हैं कि यह गतिशील रूप से भी काम करेगा।

यह शायद ध्यान देने योग्य है, हालांकि, मुझे लगता है कि लोग अक्सर इस तरह के अनावश्यक फिल्टर को जोड़ने की कोशिश करते हैं ताकि वे आउटपुट को पार्स करने के लिए एक अन्य फिल्टर के |pipeमाध्यम से व्यवस्थित कर सकें जो अनावश्यक होने की बहुत संभावना है। बेशक, लोगों द्वारा मैं ज्यादातर मेरा मतलब है।

-oUtput आपरेण्ड मैं ऊपर जो कॉलम फिल्टर करने की अनुमति देता उल्लेख psप्रदर्शित करता है, और जब आप जोड़ने के =असाइनमेंट तुम भी आप के रूप में स्तंभ नाम कर सकते हैं कृपया। मैं काम को रिक्त छोड़ दें और यह एक लक्ष्य हाथ -process $pidइतना से ही उत्पादन psबिल्कुल भी है $pidकमान नाम और उसके argsमंगलाचरण पर। और -oमुश्किल से सतह को खरोंच कर देता है कि आप कैसे परिभाषित कर सकते हैं कि क्या psप्रदर्शित करेगा या नहीं। यह वह दिशा है जो मैं आपको लेने की सलाह दूंगा, विशेषकर:

man ps

... 

बीएसडी सिंटैक्स का उपयोग कर सिस्टम पर हर प्रक्रिया को देखने के लिए:

ps ax

ps axu

एक प्रक्रिया पेड़ मुद्रित करने के लिए:

ps -ejH

ps axjf

धागे के बारे में जानकारी प्राप्त करने के लिए:

ps -eLf

ps axms

सुरक्षा जानकारी प्राप्त करने के लिए:

ps -eo euser,ruser,suser,fuser,f,comm,label

ps axZ

ps -eM

उपयोगकर्ता प्रारूप में रूट (वास्तविक और प्रभावी आईडी) के रूप में चलने वाली प्रत्येक प्रक्रिया को देखने के लिए:

ps -U root -u root u

उपयोगकर्ता-निर्धारित प्रारूप वाली प्रत्येक प्रक्रिया को देखने के लिए:

ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps -Ao pid,tt,user,fname,tmout,f,wchan

केवल प्रक्रिया ID का syslogd प्रिंट करें:

ps -C syslogd -o pid=

केवल PID 42 का नाम प्रिंट करें:

ps -p 42 -o comm=

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