Bash脚本用于获取变量中的\ n

时间:2016-05-10 15:36:04

标签: bash

搜索有关监控MongoDB某些功能的方法我发现了一个脚本来检查MongoDB中replicaSet的状态。脚本以bash完成。

last_oplog_date=`/usr/local/bin/mongo --eval "db.printReplicationInfo()" | grep 'oplog last event time' | awk 'BEGIN { FS = "time:" } ; { print $2 }'`
last_oplog_timestamp=`date -j -f ' %a %b %d %Y %H:%M:%S %Z%z (%Z)' "$last_oplog_date" +%s`
lag=0
IFS="
"
for slave_replication_date in `/usr/local/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`
do
  slave_replication_timestamp=`date -j -f ' %a %b %d %Y %H:%M:%S %Z%z (%Z)' "$slave_replication_date" +%s`
  lag_seconds=`expr $last_oplog_timestamp - $slave_replication_timestamp`
  if [ $lag_seconds -gt $lag ]; then
    lag=$lag_seconds
  fi
done
exit $lag

此代码的作者已经警告过,如果是用FreeBSD编写的。我试图在Linux中执行它并发生一些奇怪的事情。首先,我改变了用

修改数据的方式
date -d "$var" "+%s"

脚本的第一部分没有循环。所以他得到了MongoDB的oplog日期并转入时间戳。也适用于我,但......在第二部分,他做了一个for循环来获取一些信息,然后以相同的方式转换它。这是崩溃的地方。

date: invalid date « Tue May 10 2016 13:49:31 GMT+0200 (CEST)\n Tue May 10 2016 13:49:31 GMT+0200 (CEST)»

您是否注意到该脚本附加到第一次结束日期?我试图用tr -d' \ n'删除它。但也没有工作。

所以我无法进入脚本的最后一部分,因为\ n此时正在阻止我,错误为"无效日期"

我知道是否有一些非常容易修复的东西但是......我花了几个小时试图修复它而没有成功。有点沮丧。

UPDATE1:

我试图避免循环,但仍然没有成功。如果我在bash中运行mongo命令,我会得到两个数据:

/usr/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`

Output:
 Tue May 10 2016 13:49:31 GMT+0200 (CEST)
 Tue May 10 2016 13:49:31 GMT+0200 (CEST)

然后我尝试进入脚本并设法进入转义\ n

的元素数组
IFS='\n' read -r -a array <<< "$var1"

echo "${array[0]}"
echo "${array[1]}"

 Tue May 10 2016 13:49:31 GMT+0200 (CEST)

最后一个数组不显示任何内容:(

谢谢!

1 个答案:

答案 0 :(得分:0)

我终于设法解决了这个问题。

IFS=""

var1=`/usr/bin/mongo --eval "db.printSlaveReplicationInfo()" | grep 'syncedTo' | awk 'BEGIN { FS = "syncedTo:" } ; { print $2 }'`

oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $var1 )
IFS="$oldIFS"
for slave_replication_date in "${lines[@]}"
    do
        slave_replication_timestamp=`date -d "$slave_replication_date" "+%s"`
        lag_seconds=`expr $last_oplog_timestamp - $slave_replication_timestamp`

         if [ $lag_seconds -gt $lag ]; then
                lag=$lag_seconds
                exit 1
         fi
done

希望它可以帮助有同样问题的人。

由于