【问题标题】:Linux Script - supress single quote in date timeLinux Script - 抑制日期时间中的单引号
【发布时间】:2015-04-09 22:36:24
【问题描述】:

我正在学习 linux 脚本,我排练了现有的主题,请帮助。 需要帮助避免日期时间格式中的单引号正在构建最后 2 分钟的日期时间字符串,例如 -' -e 2015-02-09 11:56.*INFO -e 2015-02-09 11:55.*INFO'

当我在变量中使用字符串时,例如$X 它转换如下: -e 2015-02-09 '11:56.*INFO' -e 2015-02-09 '11:55.*INFO' 时间值前加单引号

我需要一些帮助,因为我可以将 $x 替换为: -e '2015-02-09 11:56.*INFO' -e '2015-02-09 11:55.*INFO'

下面是我的示例脚本:

#!/usr/bin/ksh -x
TEST_HOME=/home/
TEST_HOME_FILE=/home/tempop.txt
LOG_FILE=/home/testlogMin.txt


echo "test before"
grepPattern=''
cnt=1
finalGrepPattern=''
timeInMin=2
while [[ $cnt -le $timeInMin ]]; do
        echo $cnt
    date_var=`date --date="$cnt minutes ago" "+%Y-%m-%d %H:%M`
       #grepPattern=$grepPattern" -e "`date --date="$cnt minutes ago" "+%Y-%m-%d %H:%M"`".*INFO"
       #grepPattern=$grepPattern"  -e "`date --date="$cnt minutes ago" "+%Y-%m-%d %H:%M"`".*INFO"
       grepPattern="${grepPattern} -e ${date_var}"".*INFO"
       #grepPattern=$grepPattern" -e "`date --date="$cnt minutes ago" "+%Y-%m-%d %H:%M"`".*ERROR"
       #grepPattern=$grepPattern" -e "`date --date="$cnt minutes ago" "+%Y-%m-%d %H:%M"`".*WARNING"
       #grepPattern=$grepPattern" -e \""`date --date="$cnt minutes ago" "+%Y-%m-%d %H:%M"`".*INFO"\" # I changed this line
      ((cnt++))
done

finalGrepPattern=$grepPattern
echo ">>>>>>>>>>>>>>>>>>"
echo "$finalGrepPattern"
echo "*******"
echo $finalGrepPattern
echo "<<<<<<<<<<<<<<<<<"
if [ -s $LOG_FILE ]; then
        echo "File $LOG_FILE exists and its non-zero in size. Proceeding with greping last 10 mins file contents." 
    echo "$LOG_FILE"
    egrep $finalGrepPattern $LOG_FILE > $TEST_HOME/tempop.txt
    chmod 755 $TEST_HOME/tempop.txt
    echo "after egrep"
    if [ -s $TEST_HOME_FILE ]; then
        echo "$TEST_HOME_FILE is not empty. Sending  the file to XXXX server."
    fi
else
    echo "Did not find LOG_FILE GE ZERO"
fi
exit;

以下是最近运行的输出日志:

[XXXXX@ccgtestserver ~]$ ./test
+ TEST_HOME=/home/XXXXX
+ TEST_HOME_FILE=/home/XXXXX/tempop.txt
+ LOG_FILE=/home/XXXXX/testlogMin.txt
+ echo 'test before'
test before
+ grepPattern=''
+ cnt=1
+ finalGrepPattern=''
+ timeInMin=2
+ [[ 1 -le 2 ]]
+ echo 1
1
+ date '--date=1 minutes ago' '+%Y-%m-%d %H:%M'
+ date_var='2015-02-09 19:52'
+ grepPattern=' -e 2015-02-09 19:52.*INFO'
+ ((cnt++))
+ [[ 2 -le 2 ]]
+ echo 2
2
+ date '--date=2 minutes ago' '+%Y-%m-%d %H:%M'
+ date_var='2015-02-09 19:51'
+ grepPattern=' -e 2015-02-09 19:52.*INFO -e 2015-02-09 19:51.*INFO'
+ ((cnt++))
+ [[ 3 -le 2 ]]
+ finalGrepPattern=' -e 2015-02-09 19:52.*INFO -e 2015-02-09 19:51.*INFO'
+ echo '>>>>>>>>>>>>>>>>>>'
>>>>>>>>>>>>>>>>>>
+ echo ' -e 2015-02-09 19:52.*INFO -e 2015-02-09 19:51.*INFO'
 -e 2015-02-09 19:52.*INFO -e 2015-02-09 19:51.*INFO
+ echo '*******'
*******
+ echo -e 2015-02-09 '19:52.*INFO' -e 2015-02-09 '19:51.*INFO'
2015-02-09 19:52.*INFO -e 2015-02-09 19:51.*INFO
+ echo '<<<<<<<<<<<<<<<<<'
<<<<<<<<<<<<<<<<<
+ [ -s /home/XXXXX/testlogMin.txt ]
+ echo 'File /home/XXXXX/testlogMin.txt exists and its non-zero in size. Proceeding with greping last 10 mins file contents.'
File /home/XXXXX/testlogMin.txt exists and its non-zero in size. Proceeding with greping last 10 mins file contents.
+ echo /home/XXXXX/testlogMin.txt
/home/XXXXX/testlogMin.txt
+ egrep -e 2015-02-09 '19:52.*INFO' -e 2015-02-09 '19:51.*INFO' /home/XXXXX/testlogMin.txt
+ 1> /home/XXXXX/tempop.txt
egrep: 19:52.*INFO: No such file or directory
egrep: 19:51.*INFO: No such file or directory
+ chmod 755 /home/XXXXX/tempop.txt
+ echo 'after egrep'
after egrep
+ [ -s /home/XXXXX/tempop.txt ]
+ exit

【问题讨论】:

    标签: linux shell ksh


    【解决方案1】:

    我有一个粗略的解决方案,最好在连接日期字符串之前使用 tr 和 sed:

    x="2015-02-09 '11:56.*INFO'"
    
    x=`echo "$x" | tr -d "'" | sed "s/\([0-9].*INFO\)/'\1'/g"`
    

    如果您同时拥有日期字符串和“-e”,请使用它,这会使解析变得困难。

    【讨论】:

      【解决方案2】:

      单引号没有问题。引号仅在调试输出中添加,这是为了避免 *(asterisks) 扩展。删除 shebang 中的调试标志 -x。您不能修改调试输出:

      + echo -e 2015-02-09 '19:52.*INFO' -e 2015-02-09 '19:51.*INFO'
      2015-02-09 19:52.*INFO -e 2015-02-09 19:51.*INFO
      

      + 开头的行是调试输出;)


      [/]$ ksh -c "echo *"
      archive bin boot cdrom dev etc hdd home initrd.img initrd.img.old lib lib64 lost+found media mnt opt proc root run sbin source srv sys tmp usr var vertica vmlinuz vmlinuz.old
      
      [/]$ ksh -c "echo '*'"
      *
      

      【讨论】:

        猜你喜欢
        • 2013-08-03
        • 2021-06-28
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        相关资源
        最近更新 更多