如何在一行中仅 grep 特定的单词?

如何在一行中仅 grep 特定的单词?

我正在检查密码复杂度,ocredit其中/etc/pam.d/password-auth有这一行:

password   requisite pam_pwquality.so try_first_pass retry=3 minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=1 gecoscheck=1

我想 grep ocredit 值“1”并将其作为变量,比如说check_ocredit

我的脚本会检查,如果 ocredit 值不为 0,则返回“true”,否则,它将显示当前设置的值/etc/pam.d/password-auth

这是我要实现的逻辑:

if [[ $check_ocredit -ne "0" ]]
then
   true
else
   echo "Current ocredit value is : $check_ocredit"
fi

输出将如下所示:

Current ocredit value is : 1

我尝试:

grep ocredit /etc/pam.d/password-auth | awk '{print $10}' | awk -F "=" '{print $2}'

但我在想,如果 ocredit 缺失,或者不在第 10 位,那我的结果会是错误的。有人能给我一些建议吗?

答案1

您可以使用单个grep命令来执行此操作-o,“仅打印行的匹配部分”,-P这将为我们提供\K:“忽略到这里匹配的任何内容”:

$ grep -oP 'ocredit=\K\d+' /etc/pam.d/password-auth
1

因此,在您的脚本中,您可以执行以下操作:

check_ocredit=$(grep -oP 'ocredit=\K\d+' /etc/pam.d/password-auth)
if [[ "$check_ocredit" -ne "0" ]]
then
     echo "Current ocredit value is : $check_ocredit"
fi

您的版本if仅当值为 0 时才会打印该值。

答案2

你可以尝试一下

awk -F'(ocredit=)' '{print $2}' /etc/pam.d/password-auth | awk '{print $1}'

要获取变量中的值,可能的解决方案可以是:

check_ocredit=$(awk -F'(ocredit=)' '{print $2}' /etc/pam.d/password-auth | awk '{print $1}')

第一个awk将获取子字符串,之后ocredit=将类似于1 gecoscheck=1 您的情况,而第二个awk将只获取数字。

答案3

如果sed有选择,那么:

sed -n 's/.*ocredit=\([0-1]\).*/\1/p' /etc/pam.d/password-auth

将要看仅有的要匹配任意单个数字,请[0-9]使用[0-1]) 为 a0或 a1之后的任意一个ocredit=,如果找到则打印出来...该sed命令的输出可以存储在变量中,例如check_ocredit使用如下命令替换语法:

check_ocredit=$(sed -n 's/.*ocredit=\([0-1]\).*/\1/p' /etc/pam.d/password-auth)

它可以在你的脚本中以更紧凑的方式进行评估(产生的结果与示例中预期的类似)像这样:

check_ocredit=$(sed -n 's/.*ocredit=\([0-1]\).*/\1/p' /etc/pam.d/password-auth)
[ "$check_ocredit" -eq "0" ] && echo "It's a zero" || echo "It's a $check_ocredit"

相关内容