Linux的切割帮助 – 如何为分隔符指定更多的空间?

有没有办法用cut命令指定更多空格的字段分隔符? (如“”+)? 例如:在下面的string中,我喜欢达到值“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是不是我正在寻找,但如何处理“切”?

谢谢。

其实awk 正是你应该研究的工具:

 ps axu | grep '[j]boss' | awk '{print $5}' 

或者你可以完全抛弃grep因为awk知道正则expression式:

 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 | grep xyz | grep -v grep 有些人使用的| grep xyz | grep -v grep范例。

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 

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

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

用一个连续的空格replace多个连续的空格。

我喜欢用这个tr -s命令

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

这将所有的空白挤压到1空间。 这样告诉削减使用空格作为分隔符如预期的荣幸。

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

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

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

我们为什么要使用剪切? 它有一个神奇的命令,说:“我们想要第三个领域,其后的每一个领域,省略前两个领域”

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

我不相信有一个等价的awk或Perl分裂的命令,我们不知道有多less领域,即通过领域X的第三场。

更简单/更简单的解决scheme:使用cuts (削减我做的类固醇)

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

请注意, cuts字段索引是从零开始的,所以第五个字段被指定为4

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

甚至更短(不使用剪切)是:

 pgrep jboss 

作为替代,总是有perl:

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

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

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

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

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

在Solaris中,将awkreplace为nawk/usr/xpg4/bin/awk

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

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