Awk 从特定线条开始,打印与图案匹配的周围线条

Awk 从特定线条开始,打印与图案匹配的周围线条,awk,grep,diff,Awk,Grep,Diff,如果我返回一个diff,它显示,例如: 7c7 < backup=false --- > backup=true 示例文本(更改): …我想以某种方式返回: i-sMEwh2MXj3q47yWWP enabled "description=RANDOM BUSINESS INT01 backup=true Name=SOMENAME" 使用GNU awk for multi-char RS和Beginfle,这将简单地将每个多行记录视为一个记录,而不是单独将其组成行

如果我返回一个
diff
,它显示,例如:

7c7
< backup=false
---
> backup=true
示例文本(更改):

…我想以某种方式返回:

i-sMEwh2MXj3q47yWWP   enabled "description=RANDOM BUSINESS INT01  
backup=true   
Name=SOMENAME"

使用GNU awk for multi-char RS和Beginfle,这将简单地将每个多行记录视为一个记录,而不是单独将其组成行:

$ cat tst.awk
BEGINFILE {
    # make sure RS is the default so we can read/skip each header line
    RS="\n"
}

FNR==1 {
    # skip the header line and set RS to capture multi-line records
    RS="[^\"]+\"[^\"]+\"\n"
    next
}

# at this point each record is stored in RT instead of $0

NR==FNR {
    a[FNR] = RT
    next
}

RT != a[FNR] {
    printf "Record #%d:\n", FNR-1
    printf "< %s", a[FNR]
    printf "> %s", RT
}
$cat tst.awk
贝金利{
#确保RS是默认值,以便我们可以读取/跳过每个标题行
RS=“\n”
}
FNR==1{
#跳过标题行并设置RS以捕获多行记录
RS=“[^\”]+\“[^\”]+\“\n”
下一个
}
#此时,每个记录都存储在RT中,而不是$0
NR==FNR{
a[FNR]=RT
下一个
}
RT!=a[FNR]{
printf“记录#%d:\n”,FNR-1
printf“<%s”,a[FNR]
printf“>%s”,RT
}

$awk-f tst.awk原始更改
记录#2:
i-SMEW2MXJ3Q47YWWP启用“描述=随机业务INT01
备份=真
Name=SOMENAME“
更新为使用“名称”列作为唯一标识符,请参见以下注释:

$ cat tst.awk
BEGINFILE {
    # make sure RS is the default so we can read/skip each header line
    RS="\n"
}

FNR==1 {
    # skip the header line and set RS to capture multi-line records
    RS="[^\"]+\"[^\"]+\"\n"
    next
}

# at this point each record is stored in RT instead of $0
{ $0=RT }

NR==FNR {
    a[$1] = $0
    next
}

{
    if ( $1 in a ) {
        if ( $0 != a[$1] ) {
            printf "Record %s changed:\n", $1
            printf "< %s", a[$1]
            printf "> %s", $0
        }
        delete a[$1]
    }
    else {
        printf "Record %s added:\n", $1
        printf "> %s", $0
    }
}
END {
    for ( i in a ) {
        printf "Record %s deleted:\n", i
        printf "< %s", a[i]
    }
}
$cat tst.awk
贝金利{
#确保RS是默认值,以便我们可以读取/跳过每个标题行
RS=“\n”
}
FNR==1{
#跳过标题行并设置RS以捕获多行记录
RS=“[^\”]+\“[^\”]+\“\n”
下一个
}
#此时,每个记录都存储在RT中,而不是$0
{$0=RT}
NR==FNR{
a[$1]=$0
下一个
}
{
如果(一年1美元){
如果($0!=a[$1]){
printf“记录%s已更改:\n”,$1
printf“<%s”,a[$1]
printf“>%s”,$0
}
删除a[$1]
}
否则{
printf“已添加记录%s:\n”,$1
printf“>%s”,$0
}
}
结束{
为了(我在a){
printf“记录%s已删除:\n”,i
printf“<%s”,a[i]
}
}

$awk-f tst.awk原始更改
记录i-SMEW2MXJ3Q47YWWP已更改:
i-SMEW2MXJ3Q47YWWP启用“描述=随机业务INT01
备份=真
Name=SOMENAME“

使用GNU awk for multi-char RS和Beginfle,这将简单地将每个多行记录视为一条记录,而不是单独的组件行:

$ cat tst.awk
BEGINFILE {
    # make sure RS is the default so we can read/skip each header line
    RS="\n"
}

FNR==1 {
    # skip the header line and set RS to capture multi-line records
    RS="[^\"]+\"[^\"]+\"\n"
    next
}

# at this point each record is stored in RT instead of $0

NR==FNR {
    a[FNR] = RT
    next
}

RT != a[FNR] {
    printf "Record #%d:\n", FNR-1
    printf "< %s", a[FNR]
    printf "> %s", RT
}
$cat tst.awk
贝金利{
#确保RS是默认值,以便我们可以读取/跳过每个标题行
RS=“\n”
}
FNR==1{
#跳过标题行并设置RS以捕获多行记录
RS=“[^\”]+\“[^\”]+\“\n”
下一个
}
#此时,每个记录都存储在RT中,而不是$0
NR==FNR{
a[FNR]=RT
下一个
}
RT!=a[FNR]{
printf“记录#%d:\n”,FNR-1
printf“<%s”,a[FNR]
printf“>%s”,RT
}

$awk-f tst.awk原始更改
记录#2:
i-SMEW2MXJ3Q47YWWP启用“描述=随机业务INT01
备份=真
Name=SOMENAME“
更新为使用“名称”列作为唯一标识符,请参见以下注释:

$ cat tst.awk
BEGINFILE {
    # make sure RS is the default so we can read/skip each header line
    RS="\n"
}

FNR==1 {
    # skip the header line and set RS to capture multi-line records
    RS="[^\"]+\"[^\"]+\"\n"
    next
}

# at this point each record is stored in RT instead of $0
{ $0=RT }

NR==FNR {
    a[$1] = $0
    next
}

{
    if ( $1 in a ) {
        if ( $0 != a[$1] ) {
            printf "Record %s changed:\n", $1
            printf "< %s", a[$1]
            printf "> %s", $0
        }
        delete a[$1]
    }
    else {
        printf "Record %s added:\n", $1
        printf "> %s", $0
    }
}
END {
    for ( i in a ) {
        printf "Record %s deleted:\n", i
        printf "< %s", a[i]
    }
}
$cat tst.awk
贝金利{
#确保RS是默认值,以便我们可以读取/跳过每个标题行
RS=“\n”
}
FNR==1{
#跳过标题行并设置RS以捕获多行记录
RS=“[^\”]+\“[^\”]+\“\n”
下一个
}
#此时,每个记录都存储在RT中,而不是$0
{$0=RT}
NR==FNR{
a[$1]=$0
下一个
}
{
如果(一年1美元){
如果($0!=a[$1]){
printf“记录%s已更改:\n”,$1
printf“<%s”,a[$1]
printf“>%s”,$0
}
删除a[$1]
}
否则{
printf“已添加记录%s:\n”,$1
printf“>%s”,$0
}
}
结束{
为了(我在a){
printf“记录%s已删除:\n”,i
printf“<%s”,a[i]
}
}

$awk-f tst.awk原始更改
记录i-SMEW2MXJ3Q47YWWP已更改:
i-SMEW2MXJ3Q47YWWP启用“描述=随机业务INT01
备份=真
Name=SOMENAME“

这些前缀数字是否确实出现在您的文件中?@RomanPerekhrest它们没有出现,我只是想在示例中表示出来。实际上,我将删除它们,因为这是一个足够小的示例,我认为没有必要。这些前缀数字是否确实出现在您的文件中?@RomanPerekhrest它们没有出现,我只是试图在示例中表示它。事实上,我会删除它们,因为这是一个足够小的示例,我认为没有必要这样做。谢谢你,awk巫师埃德·莫顿!谢谢你的评论,很好的学习经验。我确实意识到,如果原始文件中的记录是新的/根本不存在,那么差异就不准确了,因为它会提取不正确的数据。嗯。看看这方面的方法。你不需要对它们进行分类。给我一分钟,我会发布一个替代方案。完成,现在看看。如果你还想对它们做些什么,那么我建议你编写一个脚本来替换引号中的换行符,然后你就可以在结果上运行标准的UNIX工具了。非常感谢你提供的额外支持。双重接受;)这真是太棒了,的确如此。谢谢你,awk巫师埃德·莫顿!谢谢你的评论,很好的学习经验。我确实意识到,如果原始文件中的记录是新的/根本不存在,那么差异就不准确了,因为它会提取不正确的数据。嗯。看看这方面的方法。你不需要对它们进行分类。给我一分钟,我会发布一个替代方案。完成,现在看看。如果你还想对它们做些什么,那么我建议你编写一个脚本来替换引号中的换行符,然后你就可以在结果上运行标准的UNIX工具了。非常感谢你提供的额外支持。双重接受;)那很好用。
$ cat tst.awk
BEGINFILE {
    # make sure RS is the default so we can read/skip each header line
    RS="\n"
}

FNR==1 {
    # skip the header line and set RS to capture multi-line records
    RS="[^\"]+\"[^\"]+\"\n"
    next
}

# at this point each record is stored in RT instead of $0
{ $0=RT }

NR==FNR {
    a[$1] = $0
    next
}

{
    if ( $1 in a ) {
        if ( $0 != a[$1] ) {
            printf "Record %s changed:\n", $1
            printf "< %s", a[$1]
            printf "> %s", $0
        }
        delete a[$1]
    }
    else {
        printf "Record %s added:\n", $1
        printf "> %s", $0
    }
}
END {
    for ( i in a ) {
        printf "Record %s deleted:\n", i
        printf "< %s", a[i]
    }
}
$ awk -f tst.awk orig change
Record i-sMEwh2MXj3q47yWWP changed:
< i-sMEwh2MXj3q47yWWP enabled "description=RANDOM BUSINESS INT01
backup=false
Name=SOMENAME"
> i-sMEwh2MXj3q47yWWP enabled "description=RANDOM BUSINESS INT01
backup=true
Name=SOMENAME"