Perl一行程序模拟awk脚本

Perl一行程序模拟awk脚本,perl,awk,range,Perl,Awk,Range,我对awk和perl都是新手,所以请耐心听我说。 我有以下awk脚本: awk '/regex1/{p = 0;} /regex2/{p = 1;} p' 这基本上是打印从与regex2匹配的行开始的所有行,直到找到与regex1匹配的行 例如: regex1 regex2 line 1 line 2 regex1 regex2 regex1 输出: regex2 line 1 line 2 regex2 是否可以使用perl一行程序来模拟这种情况?我知道我可以用保存

我对
awk
perl
都是新手,所以请耐心听我说。 我有以下
awk
脚本:

awk '/regex1/{p = 0;} /regex2/{p = 1;} p'
这基本上是打印从与regex2匹配的行开始的所有行,直到找到与regex1匹配的行

例如:

 regex1
 regex2
 line 1
 line 2
 regex1
 regex2
 regex1
输出:

 regex2
 line 1
 line 2
 regex2
是否可以使用
perl
一行程序来模拟这种情况?我知道我可以用保存在文件中的脚本来完成

编辑:

一个实际例子:

2017年5月24日17:00:06827[信息]123456(Blah:Blah1)服务名称::单行内容

2017年5月24日17:00:06828[信息]567890(Blah:Blah1)服务名称::内容(可能跨越多行)

2017年5月24日17:00:06829[信息]123456(废话:废话) 服务名称:多行内容。打印对象[ID1=fac adasd ID2=123231
ID3=123108状态=未知
代码=530007目的地=CA
]

2017年5月24日17:00:06830[信息]123456(Blah:Blah1)服务名称::单行内容

2017年5月24日17:00:06831[INFO]567890(Blah:Blah2)服务名称::内容(可能跨越多行)

给定搜索键123456,我想提取以下内容:

2017年5月24日17:00:06827[信息]123456(Blah:Blah1)服务名称::单行内容

2017年5月24日17:00:06829[信息]123456(废话:废话) 服务名称:多行内容。打印对象[ID1=fac adasd ID2=123231
ID3=123108状态=未知
代码=530007目的地=CA
]

2017年5月24日17:00:06830[信息]123456(Blah:Blah1)服务名称::单行内容

以下awk脚本执行此任务:

awk'/[0-9]{2}\s\w+\s[0-9]{4}/{n=0}/123456/{n=1}n'文件

不确定awk是否同时打印范围的开始和结束,但Perl会:

perl -ne 'if(/regex2/ ... /regex1/){print}' file
编辑:Awk(至少Gnu Awk)也有一个范围运算符,因此这可以更简单地完成,如下所示:

awk '/regex2/,/regex1/' file

不确定awk是否同时打印范围的开始和结束,但Perl会:

perl -ne 'if(/regex2/ ... /regex1/){print}' file
编辑:Awk(至少Gnu Awk)也有一个范围运算符,因此这可以更简单地完成,如下所示:

awk '/regex2/,/regex1/' file
这有点疯狂,但其工作原理如下:

  • -n
    在输入行上添加隐式循环
  • 当前行位于
    $\uu
  • 两个裸正则表达式匹配(
    /regex2/
    /regex1
    /)隐式地针对
    $进行测试
  • 我们在标量上下文中使用
    ,这将它转换为有状态触发器操作符

    我的意思是:
    X。。Y
    以“假”状态开始。在“false”状态下,它只计算
    X
    。如果
    X
    返回一个假值,它将保持“假”状态(并返回假本身)。
    X
    返回真值后,它将进入“真”状态并返回真值

    在“true”状态下,它只计算
    Y
    。如果
    Y
    返回false,它将保持“true”状态(并返回true本身)。一旦
    Y
    返回真值,它将进入“假”状态,但仍返回真值

  • 我们刚刚使用了
    print if/regex2//regex1/
    ,它也会打印所有终止的
    regex1

  • 仔细阅读可以发现,您可以区分范围的端点
  • 返回的“true”值。
    实际上是从
    1
    开始的序列号,因此可以通过检查
    1
  • 当到达范围的末尾时(即,我们将再次从“真”状态移动到“假”状态),返回值会在末尾加上一个
    “E0”

    “E0”
    添加到整数不会影响其数值。Perl在需要时隐式地将字符串转换为数字,而类似于
    “5E0”
    的东西只是科学符号(意思是
    5*10**0
    ,即
    5*1
    ,即
    5

  • 返回的“false”值。
    是空字符串,
我们检查
的结果是否与正则表达式
/^\d+$/
匹配,即全部为数字。这排除了空字符串(因为我们需要至少一个数字来匹配),所以我们不会打印超出范围的行。它还排除了范围中的最后一行,因为
E
不是数字

这有点疯狂,但其工作原理如下:

  • -n
    在输入行上添加隐式循环
  • 当前行位于
    $\uu
  • 两个裸正则表达式匹配(
    /regex2/
    /regex1
    /)隐式地针对
    $进行测试
  • 我们在标量上下文中使用
    ,这将它转换为有状态触发器操作符

    我的意思是:
    X。。Y
    以“假”状态开始。在“false”状态下,它只计算
    X
    。如果
    X
    返回一个假值,它将保持“假”状态(并返回假本身)。
    X
    返回真值后,它将进入“真”状态并返回真值

    在“true”状态下,它只计算
    Y
    。如果
    Y
    返回false,它将保持“true”状态(并返回true本身)。一旦
    Y
    返回真值,它将进入“假”状态,但仍返回真值

  • 我们刚刚使用了
    print if/regex2//regex1/
    ,它也会打印所有终止的
    regex1

  • 仔细阅读可以发现,您可以区分范围的端点
  • 返回的“true”值。
    实际上是从
    1
    开始的序列号,因此可以通过检查
    1
  • 当到达范围的末端时(即,我们将再次从“真”状态移动到“假”状态),r