grep + 正则表达式匹配唯一数字

grep + 正则表达式匹配唯一数字

我的目标是验证 $FILE 是否是备份文件(备份文件以 xxxx.xx.xx.xx 号码结尾

备份文件示例

ls /etc/VRTSvcs/conf/config 

  main.cf.17Dec2012.09.10.14
  main.cf.17Dec2012.09.10.23
  main.cf.17Dec2012.09.10.31

不备份文件的示例

  main.cf

我编写了以下 ksh 脚本行来验证 $FILE 是否以 xxxx.xx.xx.xx 数字结尾

     [[ ` echo  $FILE  | grep -v  '[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\.[0-9]\{2\}' `  -eq 0 ]] && echo Not Backup file

我设置了

  FILE="main.cf.17Dec2012.09.10.31" 

我在 Solaris/Linux 上运行此行,但我收到“非备份文件”提示,尽管 $FILE 以 2012.09.10.31 结尾

请告知我的 ksh 行存在什么问题(需要修复什么)才能匹配数字 - xxxx.xx.xx.xx

答案1

只需删除“-eq 0”

[[ ` echo  $FILE  | grep -v  '[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\.[0-9]\{2\}' ` ]] && echo Not Backup file

答案2

内联命令替换返回命令的输出,而不是返回代码

  ` echo  $FILE  | grep -v  '[0-9]\{4\}\.[0-9]\{2\}\.[0-9]\{2\}\.[0-9]\{2\}' ` 

将返回一个空字符串,而不是零。因此,此单行代码不会按预期工作。

答案3

为什么我们不能使用 BASH/KSH 的内置正则表达式来实现这一点?其中 FILE1 是您的旧文件名

[[ "$FILE1" =~ [0-9]{4}\.[0-9]{2}\.[0-9]{2}\.1[0-9]{2} ]] || echo "Not a backup file"

此零的时间/CPU 利用率。您不必要地使用了三个命令,echo两次和grep一次。

相关内容