Regex BASH:whilereadwithwithecho+;条件=奇怪的行为

Regex BASH:whilereadwithwithecho+;条件=奇怪的行为,regex,bash,if-statement,while-loop,Regex,Bash,If Statement,While Loop,在读取循环时,内部的“if语句”有问题。\n 例1: 81 function processconfig2() 82 { 83 pattern='^monthly' 84 while read line 85 do 86 if [[ $line =~ $pattern ]]; then 87 echo $line 88 fi 89 done < /etc/logrotate.conf | awk '/^

在读取循环时,内部的“if语句”有问题。\n

例1:

81 function processconfig2()
82 {
83     pattern='^monthly'
84     while read line
85     do
86         if [[ $line =~ $pattern ]]; then
87             echo $line
88         fi
89     done < /etc/logrotate.conf | awk '/^\/var\/log\/wtmp/, /^}/'
90     
91     exit 0
92 }

有人能给我解释一下这种奇怪的行为吗。

你的问题是你的
awk
过滤器在你的读取循环的输出上。因此,当您不回显整个文件时,您的输出不足以让awk匹配,因此它会删除所有输出

尝试不使用
awk
过滤器来了解我的意思

或者,将awk过滤器移动到读取循环之前(我想这就是想法)

模式=“^monthly”
读行时
做
如果[[$line=~$pattern]];然后
回音$线
fi

完成<另一个工作示例:

81 function processconfig2()
82 {
83     pattern='^monthly'
84     content=`awk '/^\/var\/log\/wtmp/, /^}/' /etc/logrotate.conf`
85     while read line 
86     do  
87         if [[ $line =~ $pattern ]]; then
88             echo $line"twice"
89         fi
90     done <<< "$content"
91     
92     exit 0
93 } 
81函数processconfig2()
82 {
83模式=“^monthly”
84 content=`awk'/^\/var\/log\/wtmp/,/^}/'/etc/logrotate.conf`
85边读边说
86做
87如果[[$line=~$pattern]];然后
88 echo$行“两次”
89 fi

90完成,因为它打印了两次。第二个例子中的第87行echo$行“两次”是一个证明。谢谢,看起来更优雅,会提高效率。你应该评论答案,而不是问题(如果你真的喜欢,可以向上投票并接受)感谢您使用while循环之前定义并由@forcomponent提供的变量。我的示例与bash中的一样工作。如果它不适合您,那么您的shell可能不支持
是的,它也可以工作。谢谢正如你所看到的,我的例子不那么优雅。对我来说,整个聚会的行为都很糟糕。@对同事来说,你觉得这有什么尴尬之处?过程替代?这里的绳子?你最初的问题不是bash问题。
/var/log/wtmp {
monthly
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
pattern='^monthly'
while read line
do
    if [[ $line =~ $pattern ]]; then
        echo $line
    fi
done < <(awk '/^\/var\/log\/wtmp/, /^}/' /etc/logrotate.conf)
81 function processconfig2()
82 {
83     pattern='^monthly'
84     content=`awk '/^\/var\/log\/wtmp/, /^}/' /etc/logrotate.conf`
85     while read line 
86     do  
87         if [[ $line =~ $pattern ]]; then
88             echo $line"twice"
89         fi
90     done <<< "$content"
91     
92     exit 0
93 }