shell 保存“top”CPU/CPU输出放入文件

ocebsuys  于 2023-10-23  发布在  Shell
关注(0)|答案(2)|浏览(240)

我是shell脚本的新手。我写了下面的脚本来保存“top”命令的输出到文件中:cpu.csv和mem.csv。但文件没有创建。我下面的脚本中的任何错误:

  1. #!/bin/bash
  2. TIMESTAMP=$(date +"%Y-%m-%d-%H:%M:%S")
  3. top -b -n 1 &
  4. CPU_LINE=$(grep "Cpu(s)")
  5. MEM_LINE=$(grep "KiB Mem")
  6. echo "$TIMESTAMP,$CPU_LINE" >> cpu.csv
  7. echo "$TIMESTAMP,$MEM_LINE" >> mem.csv

我希望看到'top'命令的“CPU(s)”行被保存到cpu.csv文件中,并在前面显示时间戳。

zhte4eai

zhte4eai1#

一种方法是使用awk在一次传递中提取您想要的两个项,并以已知的顺序发出它们-就像这样:

  1. IFS=$'\n' read -r -d '' cpu_line mem_line < <(
  2. top -b -n 1 | awk '
  3. /Cpu[(]s[)]/ { cpu_line=$0 }
  4. /KiB Mem/ { mem_line=$0 }
  5. END { print(cpu_line); print(mem_line); printf("\0"); }
  6. '
  7. )

.虽然在您的特定情况下,您根本不需要将数据读入shell变量,并且可以让awk直接写入输出文件;如果你使用的是 GNU awk,它也可以在内部完成date的工作:

  1. top -b -n 1 | gawk '
  2. BEGIN { timestamp = strftime("%Y-%m-%d-%H:%M:%S") }
  3. /Cpu[(]s[)]/ { printf("%s,%s\n", timestamp, $0) >> "cpu.csv" }
  4. /KiB Mem/ { printf("%s,%s\n", timestamp, $0) >> "mem.csv" }
  5. '

请注意,上面的第一个示例(使用<( ... )语法的示例)要求您的脚本使用 bash 运行,而不是sh。(此外,使用小写变量名是有意的:全大写名称用于反映或修改shell行为的变量,而POSIX标准保留至少有一个小写字符的名称用于应用程序定义的使用;参见相关标准https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html

展开查看全部
mfuanj7w

mfuanj7w2#

您的grep命令不完整。您将需要对某些内容应用模式,通常是文件或标准输入。
您可以通过管道|将一个命令的标准输出连接到另一个命令的标准输入。
举例来说:

  1. CPU_LINE=$(top -b -n 1 | grep "Cpu(s)")

这将创建CPU_LINE变量,其中包含您所期望的数据,然后输出到您的文件。

相关问题