1

我试图弄清楚如何将文件中的特定模式与正则表达式或类似的匹配。我知道我可以使用 [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>

等等

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

4

3 回答 3

1

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

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

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

于 2013-02-01T21:49:04.073 回答
0

省略从 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 不以空格开头(不应该)。

于 2013-02-01T23:17:46.830 回答
0

这是怎么回事?它将第一个参数存储在 中\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匹配)。

于 2013-09-03T20:59:04.800 回答