如何为每个命令(不包括set, echo, log)添加时间戳到bash脚本日志?
我正在运行一个备份脚本,并希望用时间戳记录所有命令:
#./svnbackup.sh 2&>1 | timestamp_xtrace > ./svn-backup.log 2>&1
这是我的函数,它不起作用:
timestamp_xtrace() {
while IFS= read -r line; do
if [[ "$line" =~ "^+ set" ]] && [[ "$line" =~ "^+ echo" ]] && [[ "$line" =~ "^+ log" ]]; then
echo "$(date) $line";
fi
done
}
我想排除一些命令(set, echo, log…),但它不起作用。有人能给我点提示解决我的问题吗?
我找到了一个可行的解决方案:
timestamp_xtrace() {
while IFS= read -r line; do
if [[ "$line" != "+ set"* ]] && [[ "$line" != "+ echo"* ]] && [[ "$line" != "+ log"* ]]; then
echo "$(date) $line";
fi
done
}
我将正则表达式(=~ "^ "+ echo"
)更改为(!= "+ echo"*
),因此测试匹配正确的行:
# cat << EOF | timestamp_xtrace
+ somecmd
+ echo "hello world!"
hello world!
+ svnadmin -args
EOF
输出:Wed Sep 30 09:12:43 CEST 2015 + somecmd
Wed Sep 30 09:12:43 CEST 2015 hello world!
Wed Sep 30 09:12:43 CEST 2015 + svnadmin -args
这个bash函数应该完成这项工作:
timestamp_xtrace() {
while IFS= read -r line; do
[[ "$line" =~ ^[[:blank:]]*(set|echo|log) ]] && echo "$(date):: $line"
done
}
^[[:blank:]]*(set|echo|log)
将在行开始处匹配set
或echo
或log
,可选在空格或制表符之前。
测试:
cat << EOF | timestamp_xtrace
foo bar
log something testing
echo and more
abc xyz
EOF
输出:Tue Sep 29 10:40:44 EDT 2015:: log something testing
Tue Sep 29 10:40:44 EDT 2015:: echo and more