awk查找多个常见模式之间是否存在特定行

时间:2014-12-14 23:17:12

标签: bash awk

我无法在我需要的时候完成我的陈述。

我需要查找每个名为Group的模式是否包含配置文件中的FUNEnable行。如果它存在然后在文件中添加一行,如果没有,则在屏幕上打印警告。可以是任意数量的模式,如下所示:

示例文件

#config file
<Some config>
More config
</Some config>

#comment about FUNEnable
Other config things

<Group small.group>
Something here
FUNEnable
Funfile /someplace/afunfile
</Group>

<Group medium.group>
More stuff here
Funfile /someplace/afunfile
</Group>

首次尝试:

cat configfile.conf | awk '/^<Group/,/^<\/Group>/' | grep -q ^'FUNEnable' || print "WARNING";

如果两个模式都没有SSLEnable,但是如果一个SSLEnable存在,则它不会打印警告。我显然需要构建一些形式的循环但不太确定

cat configfile.conf | awk -F /\n '/^<Group/,/^<\/Group>/ { if ($1 == "FUNEnable") {print $1 "\nANOTHER LINE"} else { print "WARNING"}}';

这并不能完全满足我的需要。

任何指针都会很棒。

4 个答案:

答案 0 :(得分:1)

$ awk '/^<Group/{name=$2;missing=1} /FUNEnable/{missing=0} /^<\/Group/ && missing {print "FUNEnable missing for group <" name}' configfile.conf
FUNEnable missing for group <medium.group>

工作原理:

  • /^<Group/{name=$2;missing=1}

    每次启动新组时,请将变量name初始化为组名称,将变量missing初始化为true(1)。

  • /FUNEnable/{missing=0}

    每次我们在某一行遇到FUNEnable时,请将变量missing重置为false(0)。

  • /^<\/Group/ && missing {print "FUNEnable missing for group <" name}

    当我们到达某个组的末尾并且missing为真时,则打印警告。

以上用GNU awk进行了测试。

答案 1 :(得分:0)

在awk脚本中存储一些状态。

awk '
BEGIN{ingroup = 0; found = 0;}
/begingroup/{ingroup = 1;}
$0 ~ /pattern/ && ingroup == 1{found = 1;}
/endgroup/ {if(found == 0) print "Pattern not found in group";
            found = 0; ingroup = 0;}'

在上面的脚本中,将begingrouppatternendgroup替换为相应的正则表达式。

答案 2 :(得分:0)

快速而肮脏的单行,听起来像是一个快速而肮脏的任务:

gawk -vRS='<Group' '!/\nFUNEnable.*<\/Group>/ && sub(/<\/Group>.*/,"") {print RS $0}'

它的大部分功能是将输入分解为用<Group分隔的记录,然后回显出不包含正确正则表达式的记录。您需要GNU Awk将RS设置为multichar字符串。

答案 3 :(得分:0)

这可能有效:

awk -F"\n" '{for (i=1;i<=NF;i++) if ($i~/^[ \t]*FUNEnable/) {f=1;$i=$i"\nNew line"}} 1; END  {if (!f) print "not found"} ' RS="" OFS="\n" ORS="\n\n" configfile.conf
#config file
<Some config>
More config
</Some config>

#comment about FUNEnable
Other config things

<Group small.group>
Something here
FUNEnable
New line
Funfile /someplace/afunfile
</Group>

<Group medium.group>
More stuff here
Funfile /someplace/afunfile
</Group>

如果找到以FUNEnable开头的行,则会在其后面添加一个新行 如果未找到,则在文件末尾打印not found


更具可读性:

awk '
    {
    for (i=1;i<=NF;i++) 
        if ($i~/^[ \t]*FUNEnable/) {
            f=1
            $i=$i"\nNew line"}} 
1
END  {
    if (!f) print "not found"} 
' FS="\n" RS="" OFS="\n" ORS="\n\n" configfile.conf