是否有任何方法可以使用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也不是我想要的,但是如何处理'cut'?

谢谢。


当前回答

如果你必须使用cut命令,另一种方法

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

在Solaris下,将awk替换为nawk或/usr/xpg4/bin/awk

其他回答

我仍然喜欢Perl处理空格字段的方式。 第一个字段是$F[0]。

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

我的方法是将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,因为该文件可能是过时的,它会杀死一个错误的进程。

对此,我喜欢使用tr -s命令

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

这将所有空白压缩到1个空格。这种方式告诉cut使用一个空格作为分隔符,正如预期的那样。

解决这个问题的一个方法是:

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

将多个连续空格替换为一个空格。

作为替代,总是有perl:

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

或者,如果你想要从字段#3开始的所有字段(如上面的答案之一所述):

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