是否有任何方法可以使用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'?

谢谢。


当前回答

作为替代,总是有perl:

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

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

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

其他回答

就我个人而言,我倾向于将awk用于这样的工作。例如:

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

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

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

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

实际上,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本身捕获,grep本身正在寻找字符类[j]后面的boss。

这是一种避免某些人使用的| grep xyz | grep -v grep范式的好方法。

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

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

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

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

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

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