কাটা ব্যবহার করে ডিলিমিটারের আরও স্থান কীভাবে নির্দিষ্ট করবেন?


195

কাট কমান্ড সহ আরও স্পেসের জন্য কোনও ফিল্ড ডিলিমিটার নির্দিষ্ট করার কোনও উপায় আছে কি? ("" + এর মতো)? উদাহরণস্বরূপ: নিম্নলিখিত স্ট্রিংয়ে, আমি মান '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যা বেশিরভাগ আধুনিক ডিস্ট্রোজে পাওয়া যায়। এটি আপনার যে ফর্মটি প্রয়োজন ঠিক ঠিক তেমন ফল দেবে।
সিসিপিজ্জা

উত্তর:


322

আসলে 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
দুর্দান্ত উত্তর। আমি পরের বার যখন এটি প্রয়োজন হবে এটি আবার দেখতে ফিরে আসব।
ফ্যানরল

grepকৌতুক নিম্নলিখিতরূপে crontab পরিবর্তন ফাইলের মধ্যে কাজ না বলে মনে হয়। যে কোনো কারণে?
আমির আলী আকবরী

2
আমি গ্রেপ ট্রিক শিখতে এবং ভুলতে থাকি। আমার সাম্প্রতিকতম অনুস্মারকটির জন্য ধন্যবাদ। সম্ভবত এবার এটি আটকে থাকবে তবে আমি তাতে বাজি ধরব না।
মাইকেল বুড় বার


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

9
অভিনব চিত্রণ।
হ্যাগ্রা

tr -s ' 'দুর্দান্ত শক্তিমান! আমি আশা করি এর চেয়ে ভাল আমি মনে করতে পারিawk
ক্রিস

@ ক্রিস আমার আপত্তি করতে হবে: ডি আউক এই বিষয়গুলির জন্য উপায় ভাল !!
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

40

আমি এটির জন্য টিআর-এস কমান্ডটি ব্যবহার করতে চাই

 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- 

আমি বিশ্বাস করি না যে অার্ক বা পার্ল বিভক্তির জন্য সমপরিমাণ কমান্ড রয়েছে যেখানে আমরা জানি না সেখানে কতগুলি ক্ষেত্র থাকবে, অর্থাৎ এক্স ক্ষেত্রের মাধ্যমে তৃতীয় ক্ষেত্রটি রেখে দেওয়া


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
\sএকটি জিএনইউ সিড এক্সটেনশন। ওএস এক্স-এ আপনি -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
বিশৃঙ্খলা ধীর হয় না (বিশেষত যখন কিছু অতিরিক্ত অতিরিক্ত প্রক্রিয়া থাকে) তবে সেড / গ্রেপ / কাট হয় না?
পাইেন্টেজি

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 তম কলামটি পায়, কখনও কখনও 6th ষ্ঠ হয়
রুবু 77

আমি মনে করি যে প্রশ্নটি কীভাবে ডিলিমিটারগুলিতে ব্যবহার করা যায় যাতে বিভিন্ন স্থানের বিভিন্ন স্থান থাকতে পারে। এই উদ্দেশ্যে উত্তরটি সঠিক ছিল।
ফ্লিটগুলি

Lsof এ সমস্যাটি হ'ল প্রতিটি সারিতে কলামগুলির সংখ্যা সর্বদা সুসংগত নয়।
ফ্লিটগুলি


2

আপনি যদি একটি পিএস আউটপুট থেকে কলামগুলি বেছে নিতে চান তবে কোনও কারণে -o ব্যবহার করবেন না?

যেমন

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

পিড এবং ভার্জ-কে দেওয়া হয়েছে 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

পার্ল সাদা স্থান সহ ক্ষেত্রগুলি যেভাবে পরিচালনা করে তা এখনও পছন্দ করি।
প্রথম ক্ষেত্রটি হ'ল $ এফ [0]।

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

0

আমার অ্যাপ্রোচটি হ'ল / টিএমপি-তে কোনও ফাইলের পিআইডি সঞ্চয় করা এবং এর জন্য -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হত্যার আগে ডানদিকে জিজ্ঞাসা করা আরও ভাল পদ্ধতির হতে পারে , যেহেতু ফাইলটি বাসি হতে পারে এবং এটি একটি ভুল প্রক্রিয়াটি মেরে ফেলবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.