Bash'te stdout çizgi genişliğini dinamik olarak kırpma


9

Son zamanlarda, pskomutla denemeler yapıyorum ve bazen uzun yollar bir sonraki satıra (veya ikiye) sarılıyor ve okumayı zorlaştırıyor. psÇıktıyı xkarakter sayısıyla sınırlamak için çıktıyı başka bir programa aktarmak istiyorum .

Şimdiye kadar sahip olduğum şey, ama tam olarak çalışmıyor:

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

$(stty size | cut -d' ' -f2)167 olarak değerlendirilir, ancak için geçerli bir girdi gibi görünmemektedir cut.

Bu tür bir sözdiziminin bash'de çalışmasını sağlamanın bir yolu var mı?


Bu iş benim için. Bazı çıktılar sağlayabilir misiniz?
cuonglm

dinamik kısım nerede? Belirli koşullar için farklı bir uzunluk ister misiniz? Görünüşe göre tüm çıktıları bir maksimum uzunluğa sınırlamak istiyorsunuz

@awk_FTW Duruma bağlı olarak farklı pencere ayarlarım var. Tam ekranda genişliğim 167. Diğer boyutlarda daha küçük olmam gerekecek. Bu yüzden boyutu almak için ssty aramak istiyorum.
mercimek

Deneyintput rmam; ps aux
Stéphane Chazelas

Bazı kabuklar gibi zsh, ksh93ya da bashterminal genişliği depolamak$COLUMNS
Stéphane Chazelas

Yanıtlar:


5

Aşağıdaki işler:

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

Bu ayrıca işe yarar:

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

Sorun stty, işlevini yerine getirmek için standart girdisinde tty'ye sahip olması gerektiği gibi görünüyor . Yukarıdaki iki yaklaşım bunu çözmektedir.

Başka bir seçenek daha var. Birlikte sttysitesindeki Stdin ve stdout'u her ikisi de yukarıda komutları yönlendirilir, bunun Stderr değildir ve bunun sonucu olarak, terminal işaret eder. Garip bir sttyşekilde, girdisi olarak stderr verilirse de çalışacaktır:

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

Gerçekten de öyle! Tam da aradığım şey buydu. Sadece merak ettim, nihayet tişörtünü neden ekledin?
mercimek

@lentils Hata! Hata teeayıklama sırasında eklendi. Şimdi gitti.
John1024

<& 2 ne anlama geliyor? Bu notasyonu daha önce hiç görmedim.
mercimek

@lentils Kabukta dosyalar numaralandırılır. Sıfır standart giriş, bir standart çıkış ve iki standart hata anlamına gelir. İfade <&2, girdinizi standart hatadan almanız anlamına gelir.
John1024

1
sttyterminalin ayarlarını stdin'inde stty < /dev/other-ttyaçar ( örneğin, başka bir terminalin ayarlarını almak için). Bu yüzden stdin bir boru ise veya işe yarıyorsa işe yaramayacağı garip değil <&2.
Stéphane Chazelas

8

Bazı kabuklar gibi zsh, bashya mkshotomatik olarak ayarlanır $COLUMNSEğer çağırmak için gerek kalmaz, terminalin genişliğine değişkeni sttyburada.

psBen standart olmayan (BSD-tipi) sözdizimi terminal genişliği sorgulama sorgusu destekleyen tüm uygulamaları denedim. Sizinkine şaşırmadım. Yine de COLUMNS ortam değişkeninin içeriğine bakacağını umuyorum.

Böylece şunları yapabilirsiniz:

export COLUMNS; ps aux

Değilse,

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

Terminalinize hatları sarmamasını da söyleyebilirsiniz:

tput rmam
ps aux

4

Ayrıca psçıktıyı biraz daha iyi işleyebilirsiniz .

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

ps -ww ${opts} #no word wrap

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

Bu ps, çıktısını şartnamelerinize göre ayrıştırmayı söyleyecektir .

Tabii ki, eğer sözcük kaydırma yapmazsanız, o zaman bilgi eksik probleminiz var. Tüm süreçler için gerçekten hepsine ihtiyacınız var mı? Öyleyse bir çağrı cihazında açın:

ps ww ${opts} | $PAGER

Değilse, görmek istediğinizi belirtin:

ps -o args= -p $pid

Alternatif olarak psterminaliniz hakkında açıkça bilgi verebilirsiniz --width:

man ps

...

w Geniş çıktı. Sınırsız genişlik için bu seçeneği iki kez kullanın.

-w Geniş çıktı. Sınırsız genişlik için bu seçeneği iki kez kullanın.

--width n Ekran genişliğini ayarlayın.

Bu --widthşey, herhangi bir ek filtre veya yardımcı işlem gerektirmeksizin tam olarak talep ettiğiniz özelliklere göre çalışır (bu muhtemelen -auxçıktınızı daha da fazla karmaşıklaştıracaktır ). Ve $COLUMNSyukarıda gösterildiği gibi ve Stephane'nin işaret ettiği gibi, dinamik olarak bile çalışacaktır.

Yine de, insanların genellikle bu tür gereksiz filtreleri eklemeye çalıştıklarını, böylece gereksiz olması muhtemel olan çıktıyı ayrıştırmak için başka bir filtreden |pipegeçebileceklerini fark etmeliyim . Tabii ki insanlar tarafından daha çok beni kastediyorum .

-oIkış Yukarıda söz hangi sütunların filtreleme olanağı tanır operand psgörüntüler ve eklerken =ataması bile senin kadar sütunu lütfen adlandırabilirsiniz. Ben atamayı boş bırakın ve bir hedef -process teslim $pidböylece tek çıkış pshiç $pidkomut adı ve argsçağrısında olduğunu. Ve -oneyin psgösterileceğini veya gösterilmeyeceğini nasıl tanımlayabileceğinizin yüzeyini neredeyse çizmez . Bu, özellikle almanızı tavsiye ederim yönü:

man ps

... 

BSD sözdizimini kullanarak sistemdeki her işlemi görmek için:

ps ax

ps axu

İşlem ağacı yazdırmak için:

ps -ejH

ps axjf

Konular hakkında bilgi almak için:

ps -eLf

ps axms

Güvenlik bilgisi almak için:

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

ps axZ

ps -eM

Kullanıcı biçiminde kök (gerçek ve etkili kimlik) olarak çalışan her işlemi görmek için:

ps -U root -u root u

Her işlemi kullanıcı tanımlı bir biçimde görmek için:

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

Yalnızca syslogd işlem kimliklerini yazdırın:

ps -C syslogd -o pid=

Yalnızca PID 42'nin adını yazdırın:

ps -p 42 -o comm=

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.