如何使用cut为分隔符指定更多空格?

les*_*lie 175 linux cut delimiter

有没有办法使用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
Run Code Online (Sandbox Code Playgroud)

cut -d' '不是我想要的,因为它只适用于一个空间. awk不是我正在寻找的,但如何处理'削减'?

谢谢.

pax*_*blo 294

其实awk正是你应该寻找到的工具:

ps axu | grep '[j]boss' | awk '{print $5}'
Run Code Online (Sandbox Code Playgroud)

或者你可以grep完全放弃,因为我awk知道正则表达式:

ps axu | awk '/[j]boss/ {print $5}'
Run Code Online (Sandbox Code Playgroud)

但是,如果由于某些奇怪的原因,你真的无法使用awk,你可以做其他更简单的事情,比如首先将所有空格折叠到一个空格:

ps axu | grep '[j]boss' | sed 's/\s\s*/ /g' | cut -d' ' -f5
Run Code Online (Sandbox Code Playgroud)

grep顺便说一下,这个技巧只是一种简单的方法,只能获得jboss流程而不是流程grep jboss(同样也适用于awk变体).

grep进程grep [j]boss在其进程命令中将有一个文字,因此不会被grep自己捕获,而后者正在查找[j]后跟的字符类boss.

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

  • 奥利弗,有时是“我如何用 Y 做 X?”的最佳答案。是“不要使用 Y,而是使用 Z”。既然 OP 接受了这个答案,我很可能已经说服了他们:-) (3认同)
  • 很好的答案。下次我需要的时候,我会回来再看一遍。 (2认同)
  • 我一直在学习并忘记了 grep 技巧。感谢我最近的提醒。也许这次它会坚持下去。但我不会赌它。 (2认同)

fed*_*qui 100

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

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

  • 花哨的插图. (7认同)
  • `tr -s ' '` 非常好!我希望我能比“awk”更好地记住这一点 (2认同)

小智 32

我喜欢使用tr -s命令

 ps aux | tr -s [:blank:] | cut -d' ' -f3
Run Code Online (Sandbox Code Playgroud)

这会将所有白色空间挤压到1个空间.这种方式告诉切割使用空格作为分隔符的方式符合预期.

  • 我想这应该是答案,它更接近OP的要求(要求使用cut)。这种方法比 awk 方法慢 5-10%(因为多了一个管道需要用 tr 处理),但一般来说这是无关紧要的。 (2认同)

小智 11

我将提名tr -s [:blank:]为最佳答案.

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

cat log | tr -s [:blank:] |cut -d' ' -f 3- 
Run Code Online (Sandbox Code Playgroud)

我不相信awk或perl split有一个等效的命令,我们不知道会有多少个字段,即将第3个字段放到字段X中.


ari*_*elf 9

更短/更简单的解决方案:使用cuts(我写的类固醇减少)

ps axu | grep '[j]boss' | cuts 4
Run Code Online (Sandbox Code Playgroud)

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

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

甚至更短(根本不使用切割)是:

pgrep jboss
Run Code Online (Sandbox Code Playgroud)


Jar*_* Ng 7

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

$ps axu | grep jboss | sed 's/\s\+/ /g' | cut -d' ' -f3
Run Code Online (Sandbox Code Playgroud)

用一个替换多个连续的空格.

  • `\ s`是GNU sed扩展.在OS X上,您可以将`-E`标志传递给sed以启用扩展正则表达式,然后使用`[[:space:]]`代替`\ s`,如下所示:`sed -E's/[ [:space:]] +// g'` (2认同)

pau*_*sm4 5

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

ps axu| grep jboss | grep -v grep | awk '{print $5}'
Run Code Online (Sandbox Code Playgroud)

  • 可以将其压缩为`ps axu | awk '/[j]boss/ {print $5}'`。 (6认同)