将变量中的内容附加到日志文件
Append content from variable to log file
我有一个脚本并试图将变量中的内容附加到 .log 文件。我在另一个 post(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 }’)]%
mmem=free | grep Mem | awk ‘{print / * 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
尝试在 systemstatus
之前删除 $
当您键入 $systemstatus
时,它表示一个名为 "systemstatus" 的变量,而不是系统状态文件。
您的代码需要进行多次修改,您不能按照您尝试的方式使用命令输出分配变量,您需要使用命令替换 (var=$(command)
):
mdate=$(date)
mcpu=$(( 100 - $(vmstat 1 2 | tail -1| awk '{print }') ))
mmem=$(free | grep Mem | awk '{print / * 100.0}')
您的 post 包含对 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 }') )) >>"$logfile"
free | grep Mem | awk '{print / * 100.0}' >>"$logfile"
你甚至可以把重定向放在第一位,根据你的口味,这可能会更干净:
>"$logfile" date # Overwrites the previous log file
>>"$logfile" echo $(( 100 - $(vmstat 1 2 | tail -1| awk '{print }') ))
>>"$logfile" free | grep Mem | awk '{print / * 100.0}'
此答案假定您的命令确实有效(我没有测试过)。
以下应该有效:
#!/bin/bash
mdate=$(echo date)
mcpu=$(echo $[100-$(vmstat 1 2 |tail -1|awk '{print }')]%)
mmem=$(free | grep Mem | awk '{print / * 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 中,您应该将命令四舍五入到 $() 或 `` 但是,现在已弃用重音符号。
此外,使用 cat /dev/null > 清空 Linux 中的文件基本上与仅使用 > 的结果相同
至于您遇到的问题,请注意在任何单词前附加 $ 基本上会使 script/command 查找具有此类名称的变量而不是文件名。
此致
我有一个脚本并试图将变量中的内容附加到 .log 文件。我在另一个 post(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 }’)]%
mmem=free | grep Mem | awk ‘{print / * 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
尝试在 systemstatus
$
当您键入 $systemstatus
时,它表示一个名为 "systemstatus" 的变量,而不是系统状态文件。
您的代码需要进行多次修改,您不能按照您尝试的方式使用命令输出分配变量,您需要使用命令替换 (var=$(command)
):
mdate=$(date)
mcpu=$(( 100 - $(vmstat 1 2 | tail -1| awk '{print }') ))
mmem=$(free | grep Mem | awk '{print / * 100.0}')
您的 post 包含对 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 }') )) >>"$logfile"
free | grep Mem | awk '{print / * 100.0}' >>"$logfile"
你甚至可以把重定向放在第一位,根据你的口味,这可能会更干净:
>"$logfile" date # Overwrites the previous log file
>>"$logfile" echo $(( 100 - $(vmstat 1 2 | tail -1| awk '{print }') ))
>>"$logfile" free | grep Mem | awk '{print / * 100.0}'
此答案假定您的命令确实有效(我没有测试过)。
以下应该有效:
#!/bin/bash
mdate=$(echo date)
mcpu=$(echo $[100-$(vmstat 1 2 |tail -1|awk '{print }')]%)
mmem=$(free | grep Mem | awk '{print / * 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 中,您应该将命令四舍五入到 $() 或 `` 但是,现在已弃用重音符号。
此外,使用 cat /dev/null > 清空 Linux 中的文件基本上与仅使用 > 的结果相同
至于您遇到的问题,请注意在任何单词前附加 $ 基本上会使 script/command 查找具有此类名称的变量而不是文件名。
此致