【问题标题】:Monitoring disk usage in CentOS using 'du' to output JSON在 CentOS 中使用 'du' 监控磁盘使用情况以输出 JSON
【发布时间】:2014-10-18 07:35:12
【问题描述】:

我想写一行代码来获取以下结果:

du -sh -c --time /00-httpdocs/*

并以 JSON 格式输出。目标是获取站点中每个项目文件的三个信息:目录路径、上次修改日期和人类可读格式的磁盘空间使用情况。此命令将以制表符分隔的格式输出该数据,每个条目在终端的新行中​​:

4.6G    2014-08-22 12:26    /00-httpdocs/00
1.1G    2014-08-22 13:32    /00-httpdocs/01
711M    2014-02-14 23:39    /00-httpdocs/02

目标是将其导出为 JSON 文件,因此需要将其格式化为:

{"httpdocs": [
  {
    "size": "4.6G",
    "modified": "2014-08-22 12:26",
    "path": "/00-httpdocs/00-PREVIEW"}
  {
    "size": "1.1G",
    "modified": "2014-08-22 13:32",
    "path": "/00-httpdocs/8oclock"}
  {
    "size": "711M",
    "modified": "2014-02-14 23:39",
    "path": "/00-httpdocs/8oclock.new"}
]}

(我知道这不是很合适的 JSON,我只是将它写为示例。向我们中间的迂腐表示歉意。)

我需要 size 以整数形式返回(所以也许删除 '-sh' 并稍后处理转换?)。

我尝试过使用 awk 和 sed,但我完全是新手,无法完全正确地设置格式。

我已经做到了这一点:

du -sh -c --time /00-httpdocs/* | awk ' BEGIN {print "\"httpdocs:\": [";} {print "{"$0"},\n";} END {print "]";}'

我们的目标是每天两次触发此触发器,以便我们可以获取数据并在 JavaScript 应用程序中使用它。

【问题讨论】:

    标签: json linux bash awk sed


    【解决方案1】:
    sed '1 i\
    {"httpdocs": [
    s/\([^[:space:]]*\)([[:space:]]*\([^[:space:]]*\)[[:space:]]*\([^[:space:]]*\)/  {\
        "size" : "\1",\
        "modified": "\2",\
        "path": "\3"}/
    $ a\^J]}' YourFile
    

    又快又脏(posix 版本所以--posix 在 GNU sed 上)。

    获取 3 个参数并将它们 (s/../../) 放入使用组(\( ...\)\1)的“模板”中。 在第一行包含页眉 (i \...) 并在最后添加页脚 (a \...)。 [:space:] 可能是[:blank:]

    【讨论】:

    • 嘿,这主要是成功的。我不得不稍微调整一下以考虑选项卡和包含空格的日期格式。这是最终结果:s/\([^ \t]*\) *\t\([^ ]*\s[^ \t]*\) *\t\([^\n]*\)/ {\ ...我必须在每行的末尾添加一个逗号以说明 JSON 中的逗号,即 ` "size": "\1",\ `.
    • 现在唯一缺少的是最后一个条目在右大括号后有一个逗号。我不知道如何摆脱它。不过,它总是以"total"}, 结尾,所以也许我可以在之后再做一次替换?这似乎有点荒谬。无论如何,非常感谢您的回答。真的很有帮助。
    • 我将帖子改编为标签,但不理解“最后一个条目有逗号”。你的样本没有显示它(也没有“总......”)。
    猜你喜欢
    • 2013-05-03
    • 2011-08-04
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多