ตัดความกว้างบรรทัด stdout แบบไดนามิกใน Bash


9

เมื่อเร็ว ๆ นี้ฉันได้ทดลองกับpsคำสั่งและบางครั้งเส้นทางที่ยาวพันไปยังบรรทัดถัดไป (หรือสอง) และทำให้อ่านยาก ฉันต้องการไพพ์psเอาต์พุตในโปรแกรมอื่นเพื่อ จำกัด เอาต์พุตเป็นxจำนวนอักขระ

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้ แต่มันใช้งานไม่ได้:

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

$(stty size | cut -d' ' -f2)ประเมินถึง 167 cutแต่ไม่ได้ดูเหมือนจะมีการป้อนข้อมูลที่ถูกต้องสำหรับ

มีวิธีรับไวยากรณ์ประเภทนี้ทำงานในทุบตี?


งานนี้สำหรับฉัน คุณสามารถให้ผลผลิตบางส่วนได้หรือไม่?
cuonglm

ส่วนแบบไดนามิกอยู่ที่ไหน คุณต้องการความยาวที่แตกต่างกันสำหรับเงื่อนไขบางประการหรือไม่ ดูเหมือนว่าคุณต้องการ จำกัด เอาต์พุตทั้งหมดให้มีความยาวสูงสุดหนึ่งรายการ

@awk_FTW ฉันมีการตั้งค่าหน้าต่างที่แตกต่างกันไปตามสถานการณ์ ที่เต็มหน้าจอความกว้างของฉันคือ 167 แต่ที่ขนาดอื่นฉันจะต้องเล็กกว่านี้ นั่นเป็นเหตุผลที่ฉันต้องการเรียก ssty เพื่อให้ได้ขนาด
ถั่วฝักยาว

ลองtput rmam; ps aux
Stéphane Chazelas

เปลือกหอยบางคนชอบzsh, ksh93หรือbashเก็บความกว้างขั้ว$COLUMNS
Stéphane Chazelas

คำตอบ:


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 ในอินพุตมาตรฐานเพื่อให้สามารถใช้งานได้ สองวิธีข้างต้นแก้ปัญหานั้น

ยังมีตัวเลือกอื่น ในขณะที่sttystdin และ stdout ต่างก็ถูกเปลี่ยนเส้นทางในคำสั่งข้างต้น stderr ไม่ได้เป็น: มันยังชี้ไปที่เทอร์มินัล น่าแปลกที่พอsttyจะทำงานได้เช่นกันหากได้รับ stderr เป็นอินพุต:

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

แน่นอนมันทำ! นี่คือสิ่งที่ฉันกำลังมองหา แค่อยากรู้อยากเห็นทำไมคุณถึงเพิ่มทีทีทีในตอนท้าย
ถั่วฝักยาว

@Lentils โอ๊ะโอteeถูกเพิ่มเมื่อฉันกำลังดีบั๊ก มันหายไปแล้ว
John1024

<& 2 อ้างถึงอะไร ฉันไม่เคยเห็นสัญลักษณ์นั้นมาก่อน
ถั่วฝักยาว

@lentils ในเชลล์ไฟล์จะถูกกำหนดหมายเลข ศูนย์หมายถึงอินพุตมาตรฐานหนึ่งถึงเอาต์พุตมาตรฐานและสองถึงข้อผิดพลาดมาตรฐาน การแสดงออก<&2หมายถึงได้รับการป้อนข้อมูลของคุณจากข้อผิดพลาดมาตรฐาน
John1024

1
sttyรับการตั้งค่าของเทอร์มินัลที่เปิดอยู่บน stdin (เช่นคุณstty < /dev/other-ttyได้รับการตั้งค่าของเทอร์มินัลอื่นเช่น) ดังนั้นจึงไม่แปลกที่มันจะไม่ทำงานถ้า stdin ของมันเป็นท่อหรือ<&2ทำงานได้
Stéphane Chazelas

8

เปลือกหอยบางคนชอบzsh, bashหรือmkshโดยอัตโนมัติตั้งค่า$COLUMNSตัวแปรความกว้างของอาคารเพื่อให้คุณไม่จำเป็นต้องเรียกsttyที่นี่

การใช้งานทั้งหมดของpsฉันพยายามที่สนับสนุนว่าแบบสอบถามไวยากรณ์ที่ไม่ได้มาตรฐาน (ประเภท BSD) ความกว้างขั้วด้วยตนเอง ฉันแปลกใจที่คุณไม่ได้ ฉันคาดหวังว่ามันจะดูเนื้อหาของตัวแปร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แสดงและเมื่อคุณเพิ่ม=assigment คุณยังสามารถตั้งชื่อคอลัมน์เป็นคุณกรุณา ฉันปล่อยให้การบ้านว่างเปล่าและส่งมอบให้เป้าหมาย-process $pidดังนั้นผลลัพธ์เฉพาะจากpsทั้งหมดคือ$pidชื่อคำสั่งและargsเมื่อร้องขอ และ-oแทบไม่มีรอยขีดข่วนพื้นผิวของวิธีที่คุณสามารถกำหนดสิ่งที่psจะแสดงหรือไม่แสดง นี่คือทิศทางที่ฉันอยากจะแนะนำให้คุณทำ

man ps

... 

ในการดูทุกกระบวนการในระบบโดยใช้ไวยากรณ์ BSD:

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

ในการดูทุกกระบวนการทำงานในฐานะรูท (ID จริง & มีผลบังคับใช้) ในรูปแบบผู้ใช้:

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=

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.