匹配特定的数字模式

时间:2013-02-01 21:44:05

标签: regex string bash sed awk

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

我打算独自完成这项工作,但这可以让你了解我的目标。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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不以空格开头(它不应该)。< / p>

答案 2 :(得分: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会匹配)。