कट का उपयोग करके सीमांकक के लिए अधिक रिक्त स्थान कैसे निर्दिष्ट करें?


196

क्या कट कमांड के साथ अधिक रिक्त स्थान के लिए क्षेत्र परिसीमा निर्दिष्ट करने का कोई तरीका है? (जैसे "" +)? उदाहरण के लिए: निम्नलिखित स्ट्रिंग में, मैं '3744' पर पहुंचना पसंद करता हूं, मुझे किस क्षेत्र को कहना चाहिए?

$ps axu | grep jboss

jboss     2574  0.0  0.0   3744  1092 ?        S    Aug17   0:00 /bin/sh /usr/java/jboss/bin/run.sh -c example.com -b 0.0.0.0

cut -d' 'यह नहीं है कि मैं क्या चाहता हूँ, यह केवल एक ही स्थान के लिए है। awkयह नहीं है कि मैं क्या देख रहा हूँ, लेकिन 'कट' के साथ कैसे करना है?

धन्यवाद।


13
सबसे अच्छा उत्तर trयहां दिखाया गया है: stackoverflow.com/a/4483833/168143
जॉन बाचिर

1
नहीं सीधे वास्तविक प्रश्न के लिए प्रासंगिक कहा जा रहा है, लेकिन इसके बजाय का ps+ grepआप इस्तेमाल कर सकते हैं pgrepजो सबसे आधुनिक distros में उपलब्ध है। यह परिणाम को ठीक उसी रूप में लौटाएगा जिस रूप में आपको इसकी आवश्यकता है।
ccpindra 14

जवाबों:


323

वास्तव awkमें वास्तव में उपकरण है जिसे आपको देखना चाहिए:

ps axu | grep '[j]boss' | awk '{print $5}'

या आप नियमित रूप से अभिव्यक्ति के बारे में जानने के grepबाद से पूरी तरह से खाई कर सकते हैं awk:

ps axu | awk '/[j]boss/ {print $5}'

लेकिन अगर, कुछ विचित्र कारण के लिए, तुम सच में नहीं कर सकता का उपयोग awk, वहाँ अन्य सरल चीजें आप कर सकते हैं, पतन पहले एक जगह करने के लिए सभी खाली स्थान के तरह हैं:

ps axu | grep '[j]boss' | sed 's/\s\s*/ /g' | cut -d' ' -f5

वह grepचाल, वैसे, केवल jbossप्रक्रियाओं को प्राप्त करने के लिए एक साफ-सुथरा तरीका है, न कि grep jbossएक ( awkवैरिएंट के लिए भी)।

इस grepप्रक्रिया grep [j]bossमें इसकी प्रक्रिया कमांड में एक शाब्दिक होगी, इसलिए इसे grepस्वयं नहीं पकड़ा जाएगा , जो [j]इसके बाद वर्ण वर्ग की तलाश में है boss

यह | grep xyz | grep -v grepकुछ लोगों द्वारा उपयोग किए जाने वाले प्रतिमान से बचने का एक निफ्टी तरीका है ।


1
बहुत बढ़िया जवाब। मैं अगली बार फिर से इसे देखने आऊंगा।
funroll

ऐसा grepलगता है कि ट्रिक crontab फाइलों में काम नहीं करती है। कोई कारण?
अमीर अली अकबरी

2
मैं सीखता रहता हूं और ग्रीप ट्रिक को भूलता जा रहा हूं। मेरे सबसे हाल के अनुस्मारक के लिए धन्यवाद। शायद इस बार यह चिपक जाएगा। लेकिन मैं इस पर दांव नहीं लगाऊंगा।
माइकल बूर

@ मिचेल, आपको महीने में एक बार उस टिप (और संभवतः अन्य) को मेल करने के लिए एक क्रॉन जॉब सेट करना चाहिए :-)
paxdiablo

3
ओलिवर, कभी-कभी "मैं वाई के साथ एक्स कैसे करता हूं?" "Y का उपयोग न करें, इसके बजाय Z का उपयोग करें"। जब से ओपी ने इस उत्तर को स्वीकार किया, संभावना है कि मैं उन्हें उस बात का यकीन
दिला

113

awkसंस्करण शायद जाने का सबसे अच्छा तरीका है, लेकिन cutअगर आप सबसे पहले दोहराते हैं, तो आप इसका उपयोग भी कर सकते हैं tr:

ps axu | grep jbos[s] | tr -s ' ' | cut -d' ' -f5
#        ^^^^^^^^^^^^   ^^^^^^^^^   ^^^^^^^^^^^^^
#              |            |             |
#              |            |       get 5th field
#              |            |
#              |        squeeze spaces
#              |
#        avoid grep itself to appear in the list

10
फैंसी चित्रण।
हागग्रा

tr -s ' 'बहुत अच्छा है! मुझे आशा है कि मुझे लगता है कि बेहतर याद कर सकते हैं की तुलना मेंawk
क्रिस

@ क्रिस मुझे आपत्ति है: डी अवाक इन चीजों के लिए बेहतर है !!
फेडोरक्वी 'SO रोकना नुकसान पहुँचाता है'

41

मुझे इसके लिए tr -s कमांड का उपयोग करना पसंद है

 ps aux | tr -s [:blank:] | cut -d' ' -f3

यह सभी सफेद स्थानों को 1 स्थान तक निचोड़ देता है। इस तरह से कटिंग को एक सीमांकक के रूप में एक स्थान का उपयोग करने के लिए कह देना उम्मीद के मुताबिक सम्मानित किया गया है।


1
मुझे लगता है कि यह उत्तर होना चाहिए, यह ओपी अनुरोध (कट का उपयोग करने के लिए कहा गया) के करीब है। यह अप्रोच एप्रोच की तुलना में 5-10% धीमा है (क्योंकि ट्र के साथ संभालने के लिए एक और पाइप है), लेकिन सामान्य तौर पर यह अप्रासंगिक होगा।
ओलिवर

11

मैं tr -s [:blank:]सबसे अच्छे उत्तर के रूप में नामांकित करने जा रहा हूं ।

हम कट का उपयोग क्यों करना चाहते हैं? इसमें जादू की आज्ञा है जो कहती है, "हम पहले दो क्षेत्रों को छोड़ते हुए तीसरा क्षेत्र और उसके बाद हर क्षेत्र चाहते हैं"

cat log | tr -s [:blank:] |cut -d' ' -f 3- 

मुझे विश्वास नहीं है कि awk या perl विभाजन के लिए एक समतुल्य कमांड है जहाँ हम नहीं जानते हैं कि कितने क्षेत्र होंगे, अर्थात फ़ील्ड X के माध्यम से 3rd फ़ील्ड डालें।


9

छोटा / सरल समाधान: उपयोग cuts(मेरे द्वारा लिखे गए स्टेरॉयड पर कटौती)

ps axu | grep '[j]boss' | cuts 4

ध्यान दें कि cutsफ़ील्ड इंडेक्स शून्य-आधारित हैं इसलिए 5 फ़ील्ड को 4 के रूप में निर्दिष्ट किया गया है

http://arielf.github.io/cuts/

और इससे भी कम (कट का उपयोग नहीं करना) है:

pgrep jboss

8

इसके चारों ओर एक रास्ता है:

$ps axu | grep jboss | sed 's/\s\+/ /g' | cut -d' ' -f3

एक के साथ कई लगातार रिक्त स्थान बदलने के लिए।


अजीब बात है, यह ओएस एक्स पर काम नहीं करता है। sed कमांड कई स्पेस को एक स्पेस में नहीं बदलता है।
rjurney

2
\sGNU सेड एक्सटेंशन है। ओएस एक्स पर आप -Eविस्तारित नियमित अभिव्यक्तियों को सक्षम करने के लिए फ्लैग को सेड पास कर सकते हैं , फिर इसके [[:space:]]स्थान पर उपयोग कर सकते हैं \s, जैसे:sed -E 's/[[:space:]]+/ /g'
जारेड एनजी

4

व्यक्तिगत रूप से, मैं इस तरह की नौकरियों के लिए awk का उपयोग करता हूं। उदाहरण के लिए:

ps axu| grep jboss | grep -v grep | awk '{print $5}'

6
कि नीचे संपीड़ित किया जा सकता है ps axu | awk '/[j]boss/ {print $5}'
zwol

1
अलबत्ता धीमी नहीं है (विशेषकर जब कुछ अतिविशिष्ट अन्य प्रक्रियाएं होती हैं), तो sed / grep / कट?
pihentagy

2

एक विकल्प के रूप में, वहाँ हमेशा पर्ल है:

ps aux | perl -lane 'print $F[3]'

या, यदि आप सभी फ़ील्ड # 3 पर शुरू करना चाहते हैं (जैसा कि ऊपर दिए गए किसी एक उत्तर में बताया गया है):

ps aux | perl -lane 'print @F[3 .. scalar @F]'

यह आउटपुट के साथ काम नहीं करता है lsofमैंने कोशिश की lsof|perl -lane 'print $F[5]'यह कभी-कभी 5 वीं कॉलम, कभी-कभी 6 वें
रूबो77

मुझे लगता है कि सवाल यह है कि कैसे सीमांकक का उपयोग किया गया था जिसमें विभिन्न स्थानों की संख्या हो सकती है। इस उद्देश्य के लिए उत्तर सही था।
21

Lsof में समस्या यह है कि कॉलम की संख्या हमेशा प्रत्येक पंक्ति में सुसंगत नहीं होती है।
फ्लिट्ज


2

यदि आप ps आउटपुट से कॉलम चुनना चाहते हैं, तो उपयोग न करने का कोई कारण?

जैसे

ps ax -o pid,vsz
ps ax -o pid,cmd

न्यूनतम कॉलम चौड़ाई आवंटित, कोई पैडिंग, केवल एकल अंतरिक्ष क्षेत्र विभाजक।

ps ax --no-headers -o pid:1,vsz:1,cmd

3443 24600 -bash
8419 0 [xfsalloc]
8420 0 [xfs_mru_cache]
8602 489316 /usr/sbin/apache2 -k start
12821 497240 /usr/sbin/apache2 -k start
12824 497132 /usr/sbin/apache2 -k start

Pid और vsz को 10 चार चौड़ाई, 1 अंतरिक्ष क्षेत्र विभाजक दिया गया।

ps ax --no-headers -o pid:10,vsz:10,cmd

  3443      24600 -bash
  8419          0 [xfsalloc]
  8420          0 [xfs_mru_cache]
  8602     489316 /usr/sbin/apache2 -k start
 12821     497240 /usr/sbin/apache2 -k start
 12824     497132 /usr/sbin/apache2 -k start

एक स्क्रिप्ट में इस्तेमाल किया: -

oldpid=12824
echo "PID: ${oldpid}"
echo "Command: $(ps -ho cmd ${oldpid})"

0

एक और तरीका है अगर आप कट कमांड का उपयोग करना चाहिए

ps axu | grep [j]boss |awk '$1=$1'|cut -d' ' -f5

सोलारिस में, awk को nawkया के साथ बदलें/usr/xpg4/bin/awk


0

मुझे अभी भी पसंद है जिस तरह से पर्ल सफेद जगह के साथ खेतों को संभालता है।
पहला क्षेत्र $ F [0] है।

$ ps axu | grep dbus | perl -lane 'print $F[4]'

0

मेरा दृष्टिकोण पीआईडी ​​को एक फ़ाइल / tmp में फ़ाइल में संग्रहीत करना है, और इसके लिए -Sविकल्प का उपयोग करके सही प्रक्रिया का पता लगाना है ssh। यह एक दुरुपयोग हो सकता है लेकिन मेरे लिए काम करता है।

#!/bin/bash

TARGET_REDIS=${1:-redis.someserver.com}
PROXY="proxy.somewhere.com"

LOCAL_PORT=${2:-6379}

if [ "$1" == "stop" ] ; then
    kill `cat /tmp/sshTunel${LOCAL_PORT}-pid`
    exit
fi

set -x

ssh -f -i ~/.ssh/aws.pem centos@$PROXY -L $LOCAL_PORT:$TARGET_REDIS:6379 -N -S /tmp/sshTunel$LOCAL_PORT  ## AWS DocService dev, DNS alias
# SSH_PID=$! ## Only works with &
SSH_PID=`ps aux | grep sshTunel${LOCAL_PORT} | grep -v grep | awk '{print $2}'`
echo $SSH_PID > /tmp/sshTunel${LOCAL_PORT}-pid

बेहतर तरीका यह हो सकता है SSH_PIDकि इसे मारने से पहले दाईं ओर क्वेरी करें , क्योंकि फाइल बासी हो सकती है और यह गलत प्रक्रिया को मार देगी।

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