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
甚至更短(不使用剪切)是:
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]'