如何使用cut命令指定更多的分隔符空间?

226

有没有办法在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'?

谢谢。


16
最佳答案是使用 tr,如此展示:https://dev59.com/02855IYBdhLWcg3wy3kb#4483833。 - John Bachir
1
与实际问题无直接关系,但是你可以使用在大多数现代发行版中可用的 pgrep 替代 ps+grep。它将会以你需要的形式返回结果。 - ccpizza
1
可能是如何使'cut'命令将多个字符视为一个分隔符?的重复问题。 - user9645477
现在我只是使用 hck 作为 cut 的替代品。默认情况下,它会像 awk 一样在所有空格上拆分。关键功能是您可以像 cut 一样使用 -d 指定分隔符,但与 cut 不同的是,该分隔符可以是正则表达式!不再需要在传递给 cut 之前预处理 tr -s。您可以在此处找到 hck:https://github.com/sstadick/hck - Chris
这个回答解决了你的问题吗?CUT是否支持多个空格作为分隔符? - dsimic
请查看下方的我的回答,这是一种非常方便的方法来实现所需的结果,请帮助将我的补丁上游,以使每个人都受益。 - undefined
13个回答

0

我的方法是将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

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

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

0

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接