Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在sed中匹配模式的后面追加一行不起作用_Regex_Linux_Sed_Pam - Fatal编程技术网

Regex 在sed中匹配模式的后面追加一行不起作用

Regex 在sed中匹配模式的后面追加一行不起作用,regex,linux,sed,pam,Regex,Linux,Sed,Pam,我的/etc/pam.d/system auth ac设置了以下auth参数: auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth required pam_deny.so 我想在pam_env

我的
/etc/pam.d/system auth ac
设置了以下
auth
参数:

auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so
我想在pam_env.so之后插入
pam_tally2.so
。所以我希望它是:

auth        required      pam_env.so
auth        required      pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so
我使用的脚本是:

#! /bin/bash

grep "pam_tally2" /etc/pam.d/system-auth-ac &> /dev/null
if [ $? -ne 0 ];
then
   sed -i '/^[]*account[]*required[]*pam_unix.so/aauth\trequired\tpam_tally2.so onerr=fail audit silent deny=5 unlock_time=900' /etc/pam.d/system-auth-ac
else
   sed -i 's/.*pam_tally2.*/auth\trequired\tpam_tally2.so onerr=fail audit silent deny=5 unlock_time=900/1' /etc/pam.d/system-auth-ac
fi
但它给出了这样一个错误:

sed: -e expression #1, char 116: unterminated address regex

我做错了什么?

您可以使用下面的sed命令

sed 's/^auth[[:blank:]]\+required[[:blank:]]\+pam_env\.so/&\nauth        required      pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900' file

您的正则表达式失败,因为您正在重复一个空字符类
[]
,零次或多次,这没有任何意义。因此,您需要将
[]*
更改为
[]*
*
以将空格字符重复零次或多次。

您可以在gnu中使用
a
命令:

sed -i.bak '/pam_env\.so$/a\
auth        required      pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900
' /etc/pam.d/system-auth-ac

EDIT:查看您发布的答案,与
if/else
条件下的
grep
和2
sed
命令相比,此
awk
命令似乎更适合您:

val='auth\trequired\tpam_tally2.so onerr=fail audit silent deny=5 unlock_time=900'
awk -v val="$val" '/^auth[[:blank:]]+required[[:blank:]]+pam_env\.so/ {
   print $0 RS val; next} /pam_tally2\.so/{next} 1' /etc/pam.d/system-auth-ac

auth        required      pam_env.so
uth         required      pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        required      pam_deny.so

我的剧本应该是:

#! /bin/bash

grep "pam_tally2" /etc/pam.d/system-auth-ac &> /dev/null
if [ $? -ne 0 ];
then
   sed -i '/^[ ]*auth[ ]*required[ ]*pam_env.so/aauth\trequired\tpam_tally2.so onerr=fail audit silent deny=5 unlock_time=900' /etc/pam.d/system-auth-ac
else
   sed -i 's/.*pam_tally2.*/auth\trequired\tpam_tally2.so onerr=fail audit silent deny=5 unlock_time=900/1' /etc/pam.d/system-auth-ac
fi

很好

将[]*更改为[]*
@AvinashRaj非常感谢。脚本中的小错误有时会造成很大的问题