如何将grep结果与变量进行比较?

时间:2014-08-29 08:01:47

标签: bash shell

我想将grep结果与变量进行比较。这是我的bash脚本

 check=$(grep "pam_wheel.so use_uid"  /etc/pam.d/su)
 result='#auth required pam_wheel.so use_uid'
        if [ "$check" =  "$result" ]; then
                echo "Access is not limited"
        else
                echo " limited access"       
        fi

我该怎么办?我尝试了很多组合,但我无法让它发挥作用。 提前致谢。

3 个答案:

答案 0 :(得分:3)

/etc/pam.d/*中的线条间隔得很好。 greptest是间隔敏感的(或者更确切地说,对要比较的字符串中字节的任何语义不敏感) - 如果字符串不完全相等,则比较将失败。 / p>

规范化间距的快速而合理的方法是使用在空格上分割的工具,例如Awk。

if awk -v x=1 '$1 == "#auth" && $2 == "required" &&
               $3 == "pam_wheel.so" && $4 == "use_uid" {x=0}
            END{exit x}' /etc/pam.d/su
then
    echo "Access is not limited"
else
    echo "Access is limited"
fi

或shell本身:

while read -r auth req so opts; do
    case $so:$opts in "pam_wheel.so:use_uid")
        test "$auth:req" == "#auth:required" &&
            echo "Access is not limited" ||
            echo "Access is limited" ;;
    esac
done </etc/pam.d/su

或两者的结合(这可能是最优雅的)。

或者,明确标准化所有空格:

case $(tr -s '\t ' ' ' </etc/pam.d/su | grep -m 1 "pam_wheel.so use_uid") in
    '#auth required pam_wheel.so use_uid')
        echo "Access is not limited";;
    *)  echo "Access is limited";;
esac

(另请注意这是如何避免输出的讨厌的临时变量。)

答案 1 :(得分:1)

您可以使用awk

一衬垫

awk '/pam_wheel.so use_uid/ { if ($0 == "#auth required pam_wheel.so use_uid") {print "yes"; } else { print "no";} } ' /etc/pam.d/su

Awk脚本

/pam_wheel.so use_uid/{ 
  if ($0 == "#auth required pam_wheel.so use_uid") {
    print "yes";
  } else { 
    print "no";
  }
}

  • /pam_wheel.so use_uid/:将以下脚本应用于包含字符串_pam_wheel.so的行__ use_uid _
  • $0:包含已处理的当前行(与您的模式匹配的行),我们会再次测试您的值。
  • 经典if…else结构

答案 2 :(得分:0)

它不是你问题的答案,但也许它可以帮助你。

            result='#auth required pam_wheel.so use_uid'    
            grep "$result" /etc/pam.d/su && echo "Access is not limited" ||echo " limited access" 

你的方法的另一个方面是,如果你在grep中得到多个结果,你的结果变量将具有完整的两个结果,并且它将与你的$ result变量不匹配。

             check=$(grep -m 1"pam_wheel.so use_uid"  /etc/pam.d/su)
         result='#auth required pam_wheel.so use_uid'
            if [ "$check" =  "$result" ]; then
                echo "Access is not limited"
            else
                echo " limited access"       
            fi

如果您的文件在文本周围有额外的空格,那么您必须修剪字符串以匹配。查看您可以使用的变量值

            check=$(grep -m 1"pam_wheel.so use_uid"  /etc/pam.d/su)
            result='#auth required pam_wheel.so use_uid'
            echo "D""$check""D"
            echo "D""$result""D"

这里D是任何其他字符,供您查看两个变量是否具有相同的空格数(这可能是比较失败的原因)。

希望help.happy脚本编写:)