【问题标题】:Append content from variable to log file将变量中的内容附加到日志文件
【发布时间】:2017-02-25 21:57:08
【问题描述】:

我有一个脚本并试图将我的变量中的内容附加到一个 .log 文件中。我在另一篇文章(How can I append a variable text to last line of file via command line?)上看到你可以使用 echo "$(cat $FILE)$APPEND" > $FILE.我尝试这样做,它能够无错误地运行我的脚本并通过终端给出我需要的答案,但它不会将它附加到我的日志文件中。谁能给我指点一下?

#!/bin/bash
mdate=echo date
mcpu=echo $[100-$(vmstat 1 2 |tail -1|awk ‘{print $15}’)]%
mmem=free | grep Mem | awk ‘{print $3/$2 * 100.0}’
sudo cat /dev/null > /home/daniel/systemstatus.log
echo “$(cat $systemstatus.log)$mdate” >> $systemstatus.log
echo “$(cat $systemstatus.log)$mcpu” >> $systemstatus.log
echo “$(cat $systemstatus.log)$mmem” >> $systemstatus.log

【问题讨论】:

    标签: linux bash ubuntu virtual-machine virtualbox


    【解决方案1】:

    您的代码需要进行多次修改,您无法按照您尝试的方式为命令的输出分配变量,您需要使用命令替换 (var=$(command)):

    mdate=$(date)
    mcpu=$(( 100 - $(vmstat 1 2 | tail -1| awk '{print $15}') ))
    mmem=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    

    您的帖子包含对 shell 无效的引号。使用单引号' 或双引号"(各有用途)。

    但是日志记录部分比你想象的要简单

    logfile=/home/daniel/systemstatus.log
    echo "$mdate" >"$logfile"  # Overwrites the previous log file
    echo "$mcpu"  >>"$logfile" # Appends to the log file
    echo "$mmem"  >>"$logfile" # Appends to the log file
    

    如果在变量中捕获命令输出的唯一原因是为了记录日志,您可以通过重定向到日志文件而不捕获输出来进一步简化。

    date >"$logfile" # Overwrites the previous log file
    echo $(( 100 - $(vmstat 1 2 | tail -1| awk '{print $15}') )) >>"$logfile"
    free | grep Mem | awk '{print $3/$2 * 100.0}' >>"$logfile"
    

    您甚至可以将重定向放在首位,这可能更清晰,具体取决于您的口味:

    >"$logfile"  date # Overwrites the previous log file
    >>"$logfile" echo $(( 100 - $(vmstat 1 2 | tail -1| awk '{print $15}') ))
    >>"$logfile" free | grep Mem | awk '{print $3/$2 * 100.0}'
    

    这个答案假设你的命令确实有效(我没有测试过)。

    【讨论】:

    • 非常感谢哥们的帮助,做到了,而且解释也很棒!
    【解决方案2】:

    以下应该有效:

    #!/bin/bash
    mdate=$(echo date)
    mcpu=$(echo $[100-$(vmstat 1 2 |tail -1|awk '{print $15}')]%)
    mmem=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    >/home/daniel/systemstatus.log
    echo “$(cat $systemstatus.log)$mdate” >> systemstatus.log
    echo “$(cat $systemstatus.log)$mcpu” >> systemstatus.log
    echo “$(cat $systemstatus.log)$mmem” >> systemstatus.log
    

    请注意,如果您想将命令的输出存储在 bash 中,您应该将命令四舍五入 $() 或 `` 但是,现在不推荐使用重音符号。

    此外,在 Linux 中使用 cat /dev/null > 清空文件与简单地使用 >

    的结果基本相同

    至于您遇到的问题,请注意在任何单词之前附加 $ 基本上会使脚本/命令查找具有此类名称而不是文件名的变量。

    问候

    【讨论】:

      【解决方案3】:

      尝试在systemstatus 之前删除$

      当你输入$systemstatus时,它表示一个名为“systemstatus”的变量,而不是systemstatus文件。

      【讨论】:

      • 我想OP在当前目录中创建了一个文件.log
      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多