如何为每个命令添加时间戳到bash脚本日志并排除set,echo,log?

时间:2015-09-29 14:31:34

标签: linux bash logging

如何为每个命令添加时间戳到bash脚本日志(不包括set,echo,log)?

我正在运行备份脚本,并希望使用时间戳记录所有命令:

 #./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 ...)但它不起作用.. 有人有提示来解决我的问题吗?

2 个答案:

答案 0 :(得分:1)

我找到了一个有效的解决方案:

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

答案 1 :(得分:0)

这个bash函数应该完成这项工作:

timestamp_xtrace() { 
   while IFS= read -r line; do
      [[ "$line" =~ ^[[:blank:]]*(set|echo|log) ]] && echo "$(date):: $line"
   done
}

^[[:blank:]]*(set|echo|log)将匹配setecholog在行的开头,可选地以空格或制表符开头。

<强>测试

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