在文件中使用grep命令并打印每行中的第n个单词。

5

文件 "test" 的内容:

[]# 0-CPU4    8.9%,   9336/832, 0x5ffe9b88--0x5ffec000
[]# 0-CPU0    13.5%, aa: 4/3, xvl: 35
[]# 0-CPU1    8.6%, SM: 1/4, ovl: 60
[]# 0-CPU0    38.8%, SM: 1/4, ovl: 62

从这个文件中,我想要最后一个CPU0的百分比,即38(忽略小数点)。
我使用下面的shell命令,它能正常工作,但想知道是否有更好的方法。
grep CPU0 test | tail -1 | awk '/0-CPU0/ {print $3}' | sed 's/\..*//'
#above command prints "38"
2个回答

4
假设您的数据存储在名为test的文件中:
cat test | grep CPU0 | tail -1 | awk '{ printf("%d", $3) }'

grep CPU0 test | tail -1 | awk '{ printf("%d", $3) }' - condensed

awk ' /CPU0/ {a=$3} END{ printf("%d", a) }' test - more condensed

它的作用:

  • cat 将输出 test 文件中的所有行
  • grep CPU0 将只输出包含 CPU0 的行
  • tail -1 将从 grep 的输出中给出最后一行
  • awk 将通过空格分割 []# 0-CPU0 38.8%,SM:1/4,ovl:62
  • 第一项是 []#,第二项是 0-CPU0,第三项是 38.8%
  • awk 的 printf %d 将只给出 38

尝试了第一条命令(cat...),但没有输出任何内容,printf可能出了问题? - rodee
尝试运行 cat test | grep CPU0 命令。你有输出吗?如果有,追加 | tail -1。到目前为止一切正常吗?如果是,请追加 awk '{print $3}'。你看到了 38.8% 吗? - zedfoxus
是的,awk '{print $3}' 可以工作,但 awk '{ printf("%d", $3) }' 不起作用。 - rodee
awk -Vuname -a 的输出是什么?另外,您能否检查一下输出是否出现在命令提示符之前? - zedfoxus

0
$ awk '/CPU0/{last=$3} END{sub(/[.].*/,"",last); print last}' test
38

它是如何工作的

  • /CPU0/{last=$3}

    每次遇到包含 CPU0 的行时,我们将第三个字段赋值给变量 last

  • END{sub(/[.].*/,"",last); print last}

    在文件结尾,无论文件中出现了多少次 CPU0last 都包含了最后一个 CPU0 行的值。 sub 命令会删除小数点及其后面的所有内容。然后,我们打印 last


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接