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某些人使用范式的好方法.
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)
小智 32
我喜欢使用tr -s命令
ps aux | tr -s [:blank:] | cut -d' ' -f3
Run Code Online (Sandbox Code Playgroud)
这会将所有白色空间挤压到1个空间.这种方式告诉切割使用空格作为分隔符的方式符合预期.
小智 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中.
cuts(我写的类固醇减少)ps axu | grep '[j]boss' | cuts 4
Run Code Online (Sandbox Code Playgroud)
请注意,cuts字段索引从零开始,因此第5个字段指定为4
甚至更短(根本不使用切割)是:
pgrep jboss
Run Code Online (Sandbox Code Playgroud)
解决这个问题的一种方法是:
$ps axu | grep jboss | sed 's/\s\+/ /g' | cut -d' ' -f3
Run Code Online (Sandbox Code Playgroud)
用一个替换多个连续的空格.
就我个人而言,我倾向于使用 awk 来完成这样的工作。例如:
ps axu| grep jboss | grep -v grep | awk '{print $5}'
Run Code Online (Sandbox Code Playgroud)