我无法在我需要的时候完成我的陈述。
我需要查找每个名为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"}}';
这并不能完全满足我的需要。
任何指针都会很棒。
答案 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;}'
在上面的脚本中,将begingroup
,pattern
和endgroup
替换为相应的正则表达式。
答案 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