Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl对文本文件进行grep和排序?_Perl_Text_Grep - Fatal编程技术网

如何使用Perl对文本文件进行grep和排序?

如何使用Perl对文本文件进行grep和排序?,perl,text,grep,Perl,Text,Grep,我有一个简单的日志文件,这是非常混乱,我需要它是整洁的。该文件包含日志头,但它们都混在一起了。因此,我需要根据日志头对日志文件进行排序。没有固定的行数-这意味着文本文件的每个标头没有固定的行数。我正在使用PerlGrep对标题进行排序 日志文件如下所示: Car LogFile Header <text> <text> <text> Car LogFile Header <text> Car LogFile Header <and so fo

我有一个简单的日志文件,这是非常混乱,我需要它是整洁的。该文件包含日志头,但它们都混在一起了。因此,我需要根据日志头对日志文件进行排序。没有固定的行数-这意味着文本文件的每个标头没有固定的行数。我正在使用PerlGrep对标题进行排序

日志文件如下所示:

Car LogFile Header
<text>
<text>
<text>
Car LogFile Header
<text>
Car LogFile Header
<and so forth>
my $srce = "./root/Desktop/logs/Default.log";
my $string1 = "Car LogFile Header";
open(FH, $srce);
while(my $line = <FH>) { 
  if($line =~ m/$string1/) {
    print $line;
  }
}
close FH;
Car日志文件头
车辆日志文件头
车辆日志文件头
我已经完成/搜索了一个简单的算法,但它似乎不起作用。有人能指引我吗?谢谢

#!/usr/bin/perl

#use 5.010; # must be present to import the new 5.10 functions, notice 
#that it is 5.010 not 5.10


my $srce = "./root/Desktop/logs/Default.log";
my $string1 = "Car LogFile Header";
open(FH, $srce);
my @buf = <FH>;
close(FH);
my @lines = grep (/$string1/, @buffer);
#/usr/bin/perl
#使用5.010;#必须在场才能导入新的5.10功能,请注意
#是5.010而不是5.10
my$srce=“./root/Desktop/logs/Default.log”;
my$string1=“车辆日志文件头”;
开放式(FH,$srce);
我的@buf=;
关闭(FH);
my@lines=grep(/$string1/,@buffer);

执行代码后,终端上没有显示结果。有什么想法吗?

Perl
grep
与Unix
grep
命令不同,因为它不会在屏幕上打印任何内容

一般语法是:
grep Expr,LIST

LIST
的每个元素计算
Expr
,并返回一个列表,该列表包含表达式计算为
true
的元素

在您的情况下,将返回值为
$string1
的所有
@buffer
元素


然后,您可以打印
@buffer
数组以实际查看它们。

您只是将所有内容存储在一个数组中,而不是打印出来。也没有必要将整个文件保存在内存中。您可以逐行读取和打印匹配结果,如下所示:

Car LogFile Header
<text>
<text>
<text>
Car LogFile Header
<text>
Car LogFile Header
<and so forth>
my $srce = "./root/Desktop/logs/Default.log";
my $string1 = "Car LogFile Header";
open(FH, $srce);
while(my $line = <FH>) { 
  if($line =~ m/$string1/) {
    print $line;
  }
}
close FH;
my$srce=“./root/Desktop/logs/Default.log”;
my$string1=“车辆日志文件头”;
开放式(FH,$srce);
而(我的$line=){
如果($line=~m/$string1/){
打印$行;
}
}
关闭FH;
始终使用:

use strict;
use warnings;
这会告诉您,
@buffer
未定义

#!/usr/bin/perl

use strict;
use warnings;

my $srce = "./root/Desktop/logs/Default.log";
my $string1 = "Car LogFile Header";
open(my $FH, $srce) or die "Failed to open file $srce ($!)";
my @buf = <$FH>;
close($FH);
my @lines = grep (/$string1/, @buf);
print @lines;
#/usr/bin/perl
严格使用;
使用警告;
my$srce=“./root/Desktop/logs/Default.log”;
my$string1=“车辆日志文件头”;
打开(my$FH,$srce)或死亡“无法打开文件$srce($!)”;
我的@buf=;
收盘价($FH);
my@lines=grep(/$string1/,@buf);
打印@行;
Perl对于专家来说很棘手,因此专家使用它提供的警告来保护他们不犯错误。初学者需要使用警告,这样他们就不会犯他们甚至不知道自己会犯的错误


(因为您没有机会选择输入行,
chomp
,所以末尾仍然有换行符,因此,
print
每行打印一个标题。)

我想您需要类似以下内容:

 my $srce = "./root/Desktop/logs/Default.log";
 my $string1 = "Car LogFile Header";

 open my $fh, '<',  $srce or die "Could not open $srce: $!";

 my @lines = sort grep /\Q$string1/, <$fh>;
 print @lines;
my$srce=“./root/Desktop/logs/Default.log”;
my$string1=“车辆日志文件头”;

打开我的$fh,“我不认为grep是你真正想要的。 正如你在brian的回答中指出的,grep只会给你标题,而不会给你后面的行

我认为您需要一个数组,其中每个元素都是头,后面的行一直到下一个头

比如:-

#!/usr/bin/perl

use strict;
use warnings;

my $srce = "./default.log";
my $string1 = "Car LogFile Header";
my @logs;
my $log_entry;
open(my $FH, $srce) or die "Failed to open file $srce ($!)";

my $found = 0;
while(my $buf = <$FH>)
{
    if($buf =~ /$string1/)
    {
        if($found)
        {
            push @logs, $log_entry;
        }

        $found = 1;
        $log_entry = $buf;
    }
    else
    {
        $log_entry = $log_entry . $buf; 
    }
}

if($found)
{
    push @logs, $log_entry;
}

close($FH);

print sort @logs;
#/usr/bin/perl
严格使用;
使用警告;
my$srce=“./default.log”;
my$string1=“车辆日志文件头”;
我的@logs;
我的$log_条目;
打开(my$FH,$srce)或死亡“无法打开文件$srce($!)”;
我的$found=0;
而(我的$buf=)
{
如果($buf=~/$string1/)
{
如有($已找到)
{
推送@logs,$log\u条目;
}
$found=1;
$log_entry=$buf;
}
其他的
{
$log\U entry=$log\U entry.$buf;
}
}
如有($已找到)
{
推送@logs,$log\u条目;
}
收盘价($FH);
打印排序@日志;

我想这就是人们要求的。

你好,我找到了一种从html文件中提取链接的方法

!/usr/bin/perl-w
2
3#链路抓取器1.0
2.
3#链路抓取器1.0
4#作者:peacengell
5 #28.02.13
6.
7 ####
8.
9我的$file_links=“links.txt”;
10我的@行;
11我的美元线;
12
13
14打开(文件,$FILE_链接)或死亡“找不到文件”;
15
16而(){
17口;
18$行=$;
19
20@word=split(/\s+/,$line);
21@word=grep(/href/,@word);
22美元兑x美元(@word){
23
24如果($x=~m/ul.to/){
25$x=~s/href=“//g;
26$x=~s/“//g;
27打印“$x\n”;
28
29
30                         }
31
32                 }
33
34         }

您可以使用它并修改它。如果您修改它,请告诉我。

仍然没有显示结果。它只是跳转到终端中的一个空行。不,用上面给出的日志文件文本试试。它将输出它能找到的所有“汽车日志文件头”行。错误显示为“在关闭的文件句柄$FH上的readline()。/rgex.pl第9行。”。对此有什么想法吗?如果您检查open()的返回值,就会发现类似的情况。您使用的是什么版本的Perl?这对我来说还行,从答案上剪下“n”字,5.13.4,5.10.1,5.8.8。它在5.6.2中失败了-找不到strict,这有点令人费解…OTOH,这是一个PowerPC构建的Perl,运行在我的(英特尔)Mac上,运行Snow Leopard(10.6.4),我已经很久没有使用它了。如果你想显示结果,您必须输出一些东西。您首先使用
@buf
,然后将其称为
@buffer
。我不明白为什么$fh处的“my”是因为系统现在给出了这个错误“全局符号”$scre“需要显式的包名”,因为$srce应该没有问题。@JavaNoob:因为“$scre”的拼写与“$srce”不同我没注意到,谢谢。。但代码似乎只打印标题,而不打印段落。我想一定是问错了问题。无论如何,这是正确的答案。提供一个简短的示例文件,然后向我们展示您希望输出的内容。如果这个答案不能满足您的需要,请不要接受它。他的意思是,您不能只定义一个数组而期望一个数组