【问题标题】:How to print the value of a column using awk command?如何使用 awk 命令打印列的值?
【发布时间】:2013-06-28 10:38:39
【问题描述】:

我正在尝试编写一个脚本,将 CPU 利用率和内存利用率结果打印到 csv 文件。但我只想打印位于名为“CPU”、“USERNAME”和“MEMORY”的特定列中的值。

您能否告诉我如何使用 awk 脚本实现相同的效果?使用 awk,我发现 awk'{print $2,$5}' 打印第 2 列和第 5 列的值。但我想通过提供列名而不是列号来打印值。

有可能吗?

我写的示例脚本是:

#!/bin/sh
#This is a comment
#This is my first shell script
echo "System Status Report"
date
echo "CPU Utilisation Report"
prstat -a > CPU.xls

示例输出为:

PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 
26652 root 22M 9648K sleep 1 0 94:34.26 0.2% gpp/1 
26854 root 708M 697M sleep 3 0 36:23.19 0.1% logscan/1 
25167 oracle 1254M 1225M sleep 1 0 14:07.01 0.0% oracle/10 
NPROC USERNAME SIZE RSS MEMORY TIME CPU 
41 root 1000M 834M 1.1% 143:47.47 0.4% 
60 oracle 72G 70G 99% 65:07.13 0.1%

我想在文件中得到以下输出:

USERNAME CPU 
root 0.2%  
root 0.1%
oracle 0.0%  
USERNAME MEMORY 
root 1.1% 
oracle 99%

【问题讨论】:

  • 你能给你的脚本输入示例吗?
  • @hek2mgl:我已经提供了示例脚本
  • 尝试解决方案,但您的 cpu.xls 文件应该是正确的。
  • @San 我不知道prstat。您能否提供程序的示例输出?
  • @hek2mgl - 更新了示例输出

标签: unix awk


【解决方案1】:

是的,当然。这是您可以实施的解决方案。 假设temp.tmp 是包含数据的文件。

# cat temp.tmp
Sno CPU USERNAME
1 50 foo
2 60 bar
3 65 foobar 

t.awk 有 awk 代码

# cat t.awk
NR==1 {
    for (i=1; i<=NF; i++) {
        ix[$i] = i
     }
}
NR>1 {
    print $ix[c1], $ix[c2]
} 

现在让我们看看它是否有效。

# awk -f t.awk c1=CPU c2=USERNAME temp.tmp
50 foo
60 bar
65 foobar 

我想这就是你想要的不是吗?

【讨论】:

  • @Amanpreet:是的!我想要这个..我会尝试在脚本中使用它,看看它是否有效
  • @Amanpreet:我尝试了上述步骤..它正在工作..谢谢!
  • :对不起,你的名字打错了。但是现在有一个新的问题。如果你能看到示例输出,你提供的脚本对于第一个三个记录运行良好。对于下一组仅记录用户名发布0.2% root 0.1% root 0.0% oracle USERNAME root oracle
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2015-01-06
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多