【问题标题】:Regexp dynamic variable正则表达式动态变量
【发布时间】:2014-11-21 03:51:54
【问题描述】:

我有一个名为 mycronfile 的 crontab 文件:

#30 07 03 09 RAB root bash /media/data/test1.sh
#* * * * * root bash /media/data/test2.sh
30 07 * * * root bash /media/data/test3.sh

我正在尝试向其中添加新行,但前提是它们尚不存在。这是我的代码:

while read $line; do
  com1=$(echo $line | awk '{ print $8 }')
  com2=$(echo $line | awk '{ print $7 }')
  fullCom=$(echo "$com2 $com1")
  fixMin=$(echo $line | awk '{ print $1 }')
  fixHour=$(echo $line | awk   '{ print $2 }')
  fixDate=$(echo $line | awk   '{ print $3 }')
  fixMonth=$(echo $line | awk   '{ print $4 }')

  actv=`echo "$fixMin $fixHour $fixDate $fixMonth $fixDay $user $fullCom"`

  if grep "$actv" tempcron; then
    echo "data in tempcron exist"
    echo "$actv" > /dev/null
  else
    echo "data input into file"
    echo "$actv >> tempcron"
  fi
done < myfilecron

每次我执行脚本时,tempcron 中的数据总是重复的。当然,我需要使用正确的模式从mycronfilegrep,以避免重复。但是如何用正则表达式grep呢?因为当行包含星号(*)时会出现问题。

【问题讨论】:

  • 所以你想确保$var 不包含数字?
  • 可以是数字,也可以是无数字。如果 value 包含数字,我没有任何问题,但是当 value 不包含数字时,问题就来了。
  • 目前尚不清楚您要做什么。你能试着解释清楚一点吗?
  • 我有crontab 文件。如您所知,crontab 并不总是包含数字,对吧? #-number*/number 或任何其他组合之间存在组合。我 read crontab 中的每一行并存储到变量中。我要做的只是grep 行,存储到变量中,然后将输出从变量值重定向到其他temporary file
  • 请编辑您的问题,使其尽可能清晰。谢谢。

标签: regex bash cron grep


【解决方案1】:

重写:

while read min hr date mon day user cmd; do
    actv="$min $hr $date $mon $day $user $cmd"   # only purpose I can see here
                                                 # is to fix the spaces    
    if grep -Fq "$actv" tempcron; then
        echo "data in tempcron exist"
    else
        echo "data input into file"
        echo "$actv >> tempcron"
    fi
done < myfilecron

主要问题是 $actv 字符串包含* 字符,它们是正则表达式量词。您没有告诉 grep 搜索纯字符串,而是给出了不匹配的正则表达式模式。

您的脚本的另一个大问题:while read $line -- 您给 read 一个或多个变量 names 而不是变量 values

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多