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=123231ID3=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
$进行测试
- 我们在标量上下文中使用
,这将它转换为有状态触发器操作符 我的意思是:。
以“假”状态开始。在“false”状态下,它只计算X。。Y
。如果X
返回一个假值,它将保持“假”状态(并返回假本身)。X
返回真值后,它将进入“真”状态并返回真值 在“true”状态下,它只计算X
。如果Y
返回false,它将保持“true”状态(并返回true本身)。一旦Y
返回真值,它将进入“假”状态,但仍返回真值Y
- 我们刚刚使用了
,它也会打印所有终止的print if/regex2//regex1/
行regex1
- 仔细阅读可以发现,您可以区分范围的端点
实际上是从返回的“true”值。
开始的序列号,因此可以通过检查1
1
- 当到达范围的末尾时(即,我们将再次从“真”状态移动到“假”状态),返回值会在末尾加上一个
将“E0”
添加到整数不会影响其数值。Perl在需要时隐式地将字符串转换为数字,而类似于“E0”
的东西只是科学符号(意思是“5E0”
,即5*10**0
,即5*1
)5
是空字符串,返回的“false”值。
“
。
的结果是否与正则表达式/^\d+$/
匹配,即全部为数字。这排除了空字符串(因为我们需要至少一个数字来匹配),所以我们不会打印超出范围的行。它还排除了范围中的最后一行,因为E
不是数字
这有点疯狂,但其工作原理如下:
在输入行上添加隐式循环-n
- 当前行位于
$\uu
- 两个裸正则表达式匹配(
,/regex2/
/)隐式地针对/regex1
$进行测试
- 我们在标量上下文中使用
,这将它转换为有状态触发器操作符 我的意思是:。
以“假”状态开始。在“false”状态下,它只计算X。。Y
。如果X
返回一个假值,它将保持“假”状态(并返回假本身)。X
返回真值后,它将进入“真”状态并返回真值 在“true”状态下,它只计算X
。如果Y
返回false,它将保持“true”状态(并返回true本身)。一旦Y
返回真值,它将进入“假”状态,但仍返回真值Y
- 我们刚刚使用了
,它也会打印所有终止的print if/regex2//regex1/
行regex1
- 仔细阅读可以发现,您可以区分范围的端点
实际上是从返回的“true”值。
开始的序列号,因此可以通过检查1
1
- 当到达范围的末端时(即,我们将再次从“真”状态移动到“假”状态),r