是否有任何方法可以使用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正是你应该研究的工具:

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范式的好方法。

其他回答

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

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

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

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

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

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

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

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

pgrep jboss

作为替代,总是有perl:

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

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

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

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

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

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