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

谢谢。


当前回答

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

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

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

其他回答

Awk版本可能是最好的方法,但如果你首先用tr压缩重复,你也可以使用cut:

ps axu | grep jbos[s] | tr -s ' ' | cut -d' ' -f5
#        ^^^^^^^^^^^^   ^^^^^^^^^   ^^^^^^^^^^^^^
#              |            |             |
#              |            |       get 5th field
#              |            |
#              |        squeeze spaces
#              |
#        avoid grep itself to appear in the list

作为替代,总是有perl:

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

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

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

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

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

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

如果你想从ps输出中选择列,有什么理由不使用-o?

e.g.

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

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

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