行之间的perl行匹配
我有一份档案行之间的perl行匹配,perl,shell,grep,Perl,Shell,Grep,我有一份档案 Sun Sep 9 12:34:42 2012 : Sun Sep 9 12:34:42 2012 : [Req] Send Bcast Sun Sep 9 12:34:32 2012 : RX FROM :152.14.189.4 MESG: Sun Sep 9 12:34:32 2012 : info Sun Sep 9 12:34:32 2012 : #ip=1.1.1.4 Sun Sep 9 12:34:32 2012 : RX FROM :13 S
Sun Sep 9 12:34:42 2012 : Sun Sep 9 12:34:42 2012 : [Req] Send Bcast
Sun Sep 9 12:34:32 2012 : RX FROM :152.14.189.4 MESG:
Sun Sep 9 12:34:32 2012 : info
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.4
Sun Sep 9 12:34:32 2012 : RX FROM :13
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.13
Sun Sep 9 12:34:32 2012 : RX FROM :9
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.9
Sun Sep 9 12:34:32 2012 : RX FROM :14
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.14
Sun Sep 9 12:34:32 2012 : RX FROM :5
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.5
Sun Sep 9 12:34:35 2012 : Reply back to 9
Sun Sep 9 12:34:35 2012 : Reply back to 13
Sun Sep 9 12:34:36 2012 : Reply back to 14
Sun Sep 9 12:34:37 2012 : Reply back to 1.1.1.4
Sun Sep 9 12:34:37 2012 : Reply back to 5
Sun Sep 9 12:34:42 2012 : Sun Sep 9 12:34:42 2012 : [Req] Send Bcast
Sun Sep 9 12:34:32 2012 : RX FROM :152.14.189.4 MESG:
Sun Sep 9 12:34:32 2012 : info
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.5
Sun Sep 9 12:34:32 2012 : RX FROM :13
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.9
Sun Sep 9 12:34:32 2012 : RX FROM :9
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.4
Sun Sep 9 12:34:32 2012 : RX FROM :14
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.13
Sun Sep 9 12:34:32 2012 : RX FROM :5
Sun Sep 9 12:34:32 2012 : #ip=1.1.1.14
Sun Sep 9 12:34:35 2012 : Reply back to 9
Sun Sep 9 12:34:35 2012 : Reply back to 14
Sun Sep 9 12:34:36 2012 : Reply back to 13
Sun Sep 9 12:34:37 2012 : Reply back to 4
Sun Sep 9 12:34:37 2012 : Reply back to 5
在两行“Bcast”之间,我需要搜索一个值,比如1.1.1.4,如果它在ip=1.1.1.1处都存在,则返回1.1.1.4。然后我需要忽略那一组。否则,我需要将差异写入两个单独的文件中。我试着用perl来做这件事。当我尝试在Bcast和Bcast之间搜索时,没有打印任何内容。我遗漏了什么吗?
这是我写的
open my $in,'<',$ARGV[0];
open my $out,'>',"File2.txt";
my $Flag =0;
while(<$in>){
if (/Bcast/ .. /Bcast/)
{
print ;
if ( ($_ =~ m{ ip=1\.1\.1\.4 }xms) )
{
$Flag=$Flag+1;
print " \nMatch is Found !!! Hurray \n" if ($Flag==2);
}
}
$Flag=0;
}
打开我的$in',“File2.txt”;
我的$Flag=0;
while(){
如果(/Bcast//Bcast/)
{
印刷品;
if($uz=~m{ip=1\.1\.1\.4}xms))
{
$Flag=$Flag+1;
如果($Flag==2),则打印“\n找到匹配!!!万岁\n”;
}
}
$Flag=0;
}
请帮助我/Bcast/将在同一行上启动和停止<代码>/Bcast//Bcast/更有希望,但随后您会意识到您正在跳过每一个块 事实上,一旦你找到第一个,你总是在一个Bcast块中,所以你不应该试图用触发器来确定你是否在一个Bcast块中
# 0: Haven't see Bcast
# 1: Haven't seen "#ip=1.1.1.4" in this Bcast.
# 2: Haven't seen "Reply to 1.1.1.4" in this Bcast.
# 3: Found match
my $state = 0;
while (<>) {
if (/Bcast/) {
$state = 1;
}
if ($state == 1) {
if (/ : \#ip=(\S+)/ && $1 eq '1.1.1.4') {
$state = 2;
}
}
elsif ($state == 2) {
if (/ : Reply back to (\S+)/ && $1 eq '1.1.1.4') {
$state = 3;
print("Found match\n");
}
}
}
#0:尚未看到Bcast
#1:在本次广播中没有看到“#ip=1.1.1.4”。
#2:在本Bcast中未看到“回复1.1.1.4”。
#3:找到匹配项
我的$state=0;
而{
如果(/Bcast/){
$state=1;
}
如果($state==1){
如果(/:\ \ ip=(\S+/&&&$1等式'1.1.1.4'){
$state=2;
}
}
elsif($state==2){
如果(/:回复(\S+/&&&$1等式'1.1.1.4'){
$state=3;
打印(“找到匹配项”);
}
}
}
注意:您的原始代码可能会意外匹配
1.1.1.43
/Bcast//Bcast/
将在同一行上启动和停止<代码>/Bcast//Bcast/更有希望,但随后您会意识到您正在跳过每一个块
事实上,一旦你找到第一个,你总是在一个Bcast块中,所以你不应该试图用触发器来确定你是否在一个Bcast块中
# 0: Haven't see Bcast
# 1: Haven't seen "#ip=1.1.1.4" in this Bcast.
# 2: Haven't seen "Reply to 1.1.1.4" in this Bcast.
# 3: Found match
my $state = 0;
while (<>) {
if (/Bcast/) {
$state = 1;
}
if ($state == 1) {
if (/ : \#ip=(\S+)/ && $1 eq '1.1.1.4') {
$state = 2;
}
}
elsif ($state == 2) {
if (/ : Reply back to (\S+)/ && $1 eq '1.1.1.4') {
$state = 3;
print("Found match\n");
}
}
}
#0:尚未看到Bcast
#1:在本次广播中没有看到“#ip=1.1.1.4”。
#2:在本Bcast中未看到“回复1.1.1.4”。
#3:找到匹配项
我的$state=0;
而{
如果(/Bcast/){
$state=1;
}
如果($state==1){
如果(/:\ \ ip=(\S+/&&&$1等式'1.1.1.4'){
$state=2;
}
}
elsif($state==2){
如果(/:回复(\S+/&&&$1等式'1.1.1.4'){
$state=3;
打印(“找到匹配项”);
}
}
}
请注意,您的原始代码可能会意外匹配
1.1.1.43
耶。。现在我意识到。。基本上两个定界符不能相同:(…让我试着更改它..我确信它会工作!!谢谢..是的..现在我意识到..基本上两个定界符不能相同:(…让我试着更改它..我确信它会工作!!谢谢..没有必要显式打开$ARGV[0]
。只需使用while()
读取@ARGV
中的所有文件。无需显式打开$ARGV[0]
。只需使用while()
读取@ARGV
中的所有文件即可。