如何只 grep 1 行中的某个单词?

msm*_*tic 6 command-line bash

我正在检查这一行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
Run Code Online (Sandbox Code Playgroud)

我想 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
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

Current ocredit value is : 1
Run Code Online (Sandbox Code Playgroud)

我尝试:

grep ocredit /etc/pam.d/password-auth | awk '{print $10}' | awk -F "=" '{print $2}'
Run Code Online (Sandbox Code Playgroud)

但我在想,如果 ocredit 丢失了,或者它不在第 10 位怎么办……所以我的结果会是错误的。有人可以就此给我建议吗?

ter*_*don 8

您可以使用“仅打印该行的匹配部分”的单个grep命令来完成此操作,这给了我们:“忽略与此处匹配的任何内容”:-o-P\K

$ grep -oP 'ocredit=\K\d+' /etc/pam.d/password-auth
1
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

您的版本if只会在值为 0 时打印该值。