web-dev-qa-db-ja.com

カットを使用して区切り文字にさらにスペースを指定するにはどうすればよいですか?

Cutコマンドでより多くのスペースにフィールド区切り文字を指定する方法はありますか? ( "" +)など?たとえば、次の文字列では、値「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も私が探しているものではありませんが、「カット」をどうするか?

ありがとう。

162
leslie

実際、awkexactly探しているツールです:

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トリックは、grep jbossプロセスではなくjbossプロセスのみを取得するのに適した方法です(awkバリアントも同様)。

grepプロセスには、プロセスコマンドにリテラルgrep [j]bossが含まれているため、grep自体にキャッチされません。このクラスは、bossが後に続く文字クラス[j]を探します。

これは、一部の人々が使用する| grep xyz | grep -v grepパラダイムを回避するための気の利いた方法です。

269
paxdiablo

おそらく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
92
fedorqui

これにはtr -sコマンドを使用したい

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

これにより、すべての空白が1つのスペースに絞り込まれます。このように、区切り文字としてスペースを使用するようにcutに指示すると、期待どおりに処理されます。

24
Rob D

私はtr -s [:blank:]をベストアンサーとして指名するつもりです。

カットを使用する理由「最初の2つのフィールドを省略して、3番目のフィールドとその後のすべてのフィールドが必要です」という魔法のコマンドがあります。

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

フィールド数がわからない、つまり3番目のフィールドをフィールドXに出力するawkまたはPerl分割用の同等のコマンドがあるとは思わない。

9
Wayne Mehl

より短く/簡単な解決策: cuts を使用します(私が書いたステロイドを削減します)

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

cutsフィールドインデックスはゼロベースであるため、5番目のフィールドは4として指定されることに注意してください。

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

さらに短く(カットをまったく使用しない)は次のとおりです。

pgrep jboss
7
arielf

これを回避する方法の1つは次のとおりです。

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

複数の連続したスペースを単一のスペースに置き換える。

7
Jared Ng

個人的には、このような仕事にはawkを使用する傾向があります。例えば:

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

Ps出力から列を選択する場合、-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

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})"
2
Mike

別の方法として、常にPerlがあります。

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

または、フィールド#3から始まるすべてのフィールドを取得する場合(上記の回答のいずれかに記載されているように):

ps aux | Perl -lane 'print @F[3 .. scalar @F]'
1
flitz

Perlが空白を含むフィールドを処理する方法が今でも好きです。
最初のフィールドは$ F [0]です。

$ ps axu | grep dbus | Perl -lane 'print $F[4]'
0
AAAfarmclub

私のアプローチは、PIDを/ tmpのファイルに保存し、ssh-Sオプションを使用して適切なプロセスを見つけることです。それは誤用かもしれませんが、私には有効です。

#!/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を照会することをお勧めします。

0
Ondra Žižka

Cutコマンドを使用する必要がある場合の別の方法

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

Solarisでは、awkをnawkまたは/usr/xpg4/bin/awkに置き換えます

0
BMW