Bash脚本中严格的正则表达式字符串比较

时间:2012-10-03 21:01:01

标签: regex bash registry

我正在尝试编写一个简单的Bash脚本来帮助我验证一些Windows注册表设置。所有数据都在文件夹中(这是计算机的主机名),并且位于脚本中指定的路径中。最终目标是根据行末的注册表项值验证错误设置值的主机。

作为脚本的参考,参数一是我想要查找的注册表项,参数二是它应该是的值。如果$control$value字符串末尾的匹配,那么它应输出机器名称,即变量$FOLDER

list=$(ls)
regkey=$1
control=$2

for FOLDER in $list
do
value=$($FOLDER/policies/Effective-Security-policy.txt | grep "$regkey")
if [[ "$value" =~ $control ]] ;
    then
        echo $FOLDER
    else
        continue
fi  
done

但是,我不能让它进行严格的比较,因为还有一个名为RestrictAnonymousSAM的注册表项,它会列出不正确的值。

以下是文本文件中的一些行,我需要能够区分这两行,因此返回的值是针对该特定注册表项的:

MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,0
MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1

1 个答案:

答案 0 :(得分:0)

如果我理解你正在尝试做什么,我认为你应该写:

regkey="$1"
control="$2"

for FOLDER in * ; do
  file="$FOLDER/policies/Effective-Security-policy.txt"
  if iconv -s -f utf-16 -t utf-8 "$file" \
       | grep -q '^[^=]*\\'"$regkey=$control$"
  then
    echo "$FOLDER"
  fi    
done

grep -q在文件中搜索与模式匹配的行,但将其打印出来。这使得它非常适合在if - 测试中使用,因为grep如果找到匹配并且0(错误/假),则返回1(成功/ true)如果没有。

(重要说明:以上假设$regkey$control不能包含grep可能特别处理的任何元字符。如果可以,则这变得更加棘手。)