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

谢谢。


当前回答

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

其他回答

如果你想从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})"

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

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

更短/更简单的解决方案:使用切割(我写的是类固醇切割)

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

请注意,cuts字段索引是从零开始的,因此第5个字段被指定为4

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

更简短的(完全不使用cut)是:

pgrep jboss

我将提名tr -s[:空白:]作为最佳答案。

为什么我们要用cut?它有一个神奇的命令,说“我们想要第三个字段和它之后的每个字段,省略前两个字段”

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

我不相信有一个等价的命令awk或perl分裂,我们不知道会有多少字段,即通过字段X的第三个字段。

实际上,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范式的好方法。