【问题标题】:Matching a specific numeric pattern匹配特定的数字模式
【发布时间】:2013-01-17 07:28:02
【问题描述】:

我正在尝试找出如何将文件中的特定模式与正则表达式或类似表达式进行匹配。我知道我可以使用 [0-9] 来查找 0 - 9 之间的任何数字,但我如何只提取特定数字?例如,我想要 0 - 14 但想忽略 16 - 60。

我只在文件的第一列中查找此信息(即 awk '{ print $1 }'),并且我还需要在其中包含星号 (*) (crontab)。

对此的任何帮助将不胜感激(以及解释此问题的文档链接 - 我找不到任何涵盖此类问题的内容)。

谢谢

编辑:根据要求,这是我正在寻找的样本。

两个 cron 作业:

*/5 * * * * /bin/bash /some/path/script.sh
20 * * * * /bin/bash /home/path/script2.sh

应该选择第一个,忽略第二个。我正在从 /var/spool/cron/ 读取,所以我希望输出是这样的:

filename
<cron job here>
filename2
<cron job here>
<other cron job here>

等等

我本来打算自己解决这个问题,但这让你知道我要做什么。

【问题讨论】:

    标签: regex string bash sed awk


    【解决方案1】:

    正则表达式在匹配数值范围方面非常糟糕。您可以改用 awk:

    crontab -l | awk '$1 == "*" || $1 ~ /^[0-9]+$/ && $1 < 15 {print}'
    

    将显示分钟部分为 * 或 0-14(含)的所有 crontab 条目。

    【讨论】:

    • 谢谢,这似乎是在正确的轨道上。我试图只使用正则表达式并且没有得到任何地方,这就解释了为什么。 :)
    • 虽然你也可以使用awk '$1 ~ /^[0-9*]$|^1[0-4]$/'
    【解决方案2】:

    省略从 crontab 获取每一行到 $line 下面的位,这可能会产生您想要的结果(它假设 */20 和 20 就您而言都超过 14 - 换句话说,它只测试数字部分)。

      number="${line%% *}"  # Remove everything from 1st space to right end
      if [ -n "$number" ] ; then
        line="${number//[!0-9]/}"  # Lose anything non-numeric
        if (( ${number:-0} <= 14 )) ; then
          echo "$line"
        fi
      fi
    

    如果您保证 $line 不是空白或所有空格都进入,则不需要外部 if。在任何情况下,您都需要确保 $line 不以空格开头(它不应该)。

    【讨论】:

      【解决方案3】:

      这是怎么回事?它将第一个参数存储在\1 中,并将脚本名称存储在\2 中。

      ^\s*(0?\d|1[0-5]|\*(?:/\d{1,2})?)\s.*\s([/\w.]+)$
      

      匹配的东西:

      $ grep -P "^\s*(0?\d|1[0-5]|\*(?:/\d{1,2})?)\s.*\s([/\w.]+)$" fakecrontab.txt
      * * * * * /bin/bash /home/path/script.sh
      */5 * * * * /bin/bash /home/path/script.sh
      */15 * * * * /bin/bash /home/path/script.sh
      05 * * * * /bin/bash /home/path/script.sh
      5 * * * * /bin/bash /home/path/script.sh
      

      不匹配的东西:

      $ grep -vP "^\s*(0?\d|1[0-5]|\*(?:/\d{1,2})?)\s.*\s([/\w.]+)$" fakecrontab.txt  
      25 * * * * /bin/bash /home/path/script.sh
      

      请注意,它假定数据的某些有效性(例如,*/99 会匹配)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        相关资源
        最近更新 更多