打印配置文件部分的最小awk程序是什么?

打印配置文件部分的最小awk程序是什么?,awk,Awk,首先,我知道遵循这种格式的普通conf文件(我不知道它叫什么)通常有一个空行分隔部分,这使得这个问题变得容易得多。但我想知道是否有一种小而干净的方法可以在awk中只打印以下文件的第2部分(称为test.conf): 我的第一个猜测失败了: bash-3.2$ awk '/^\[section2\]$/,/^\[/' test.conf [section2] 因为同一行同时匹配起始和结束范围分隔符。我觉得有一种更好的方法可以做到这一点,而不是在进入第2节时设置一些变量,然后在进入下一节时将其关闭

首先,我知道遵循这种格式的普通conf文件(我不知道它叫什么)通常有一个空行分隔部分,这使得这个问题变得容易得多。但我想知道是否有一种小而干净的方法可以在awk中只打印以下文件的第2部分(称为test.conf):

我的第一个猜测失败了:

bash-3.2$ awk '/^\[section2\]$/,/^\[/' test.conf
[section2]
因为同一行同时匹配起始和结束范围分隔符。我觉得有一种更好的方法可以做到这一点,而不是在进入第2节时设置一些变量,然后在进入下一节时将其关闭。有人知道吗?

这个应该可以

awk '/\[section2\]/,/\[section3\]/{if ($0 !~ /\[section3\]/) print}' test.conf
或者更容易使用sed

sed -n '/\[section2\]/,/\[section3\]/{/\[section3\]/!p}' test.conf
AWK解决方案 通常不能保证其部分的顺序,因此以下内容有些脆弱,因为它依赖于顺序。但是,它非常短,并且适用于您定义的语料库

$ gawk '/section3/ {exit}; /section2/,/section3/ {print}' /tmp/foo.ini
[section2]
c=3
d=4
选择
  • 使用sed删除行。简短且不依赖顺序,但可能有点神秘

    $ sed -n '/section2/, /^\[/ { /section[^2]/d; p }' /tmp/foo.ini
    [section2]
    c=3
    d=4
    
  • 使用Perl的触发器操作符。非常灵活

    $ perl -ne 'push(@lines, $_) if /section2/.../section3/;
                END {pop @lines; print @lines}' /tmp/foo.ini
    [section2]
    c=3
    d=4
    
您可以尝试以下方法:

awk -vRS=[ /section2/ test.conf
结果并不完美:

section2]    
c = 3         
d = 4         

另一个命令:

awk -vRS=[ '/section2/{print RS$0}' test.conf

另一个
awk

awk '/section3/ {exit} /section2/ {f=1} f' /tmp/foo.ini

不是最短的一个,但至少节顺序不会破坏它:

$ awk '/^\[section2/ {p=1; next}; /^\[/ {p=0}; p'  test.conf
c = 3         
d = 4

并且适用于每个awk。

请使用printf而不是print,以避免记录末尾出现多余的换行符。但是,为了有效地使用RS来查找节,+1。这是一个gawk解决方案,并非所有awk都支持这种类型的RSAdding
-F“section2]”
,执行
{print$2}
将去掉节头,但在有用的输出前后都会有空行。@Jotne,这是一个简单的单字符
RS
,据我所知,应该得到很好的支持。编辑:你的意思是-v选项,好的。谢谢你的回答!我不知道触发器运算符是什么,但我将进一步了解它。
$ awk '/^\[section2/ {p=1; next}; /^\[/ {p=0}; p'  test.conf
c = 3         
d = 4