使用3个不同选项搜索和显示文件中的行的Shell脚本

使用3个不同选项搜索和显示文件中的行的Shell脚本,shell,awk,sed,grep,Shell,Awk,Sed,Grep,我有一个awk命令,它将存储结果,如下所示,从我想要传递参数的结果中,使用3个条件获取我的记录 awk'/^e20[0-9][0-9]/{d=$1fs$2fs$3;f=1;n=NR}f&&/location/$1=$1;gsub/[]/,;打印n,d,$0;f=0}'OFS='|'日志文件>>错误日志 输入错误日志文件如下所示 1434887|E 2014-04-10 23:07:02.288|location=PIN_ERRLOC_PCP:2|class=PIN_ERRCLASS_SYST

我有一个awk命令,它将存储结果,如下所示,从我想要传递参数的结果中,使用3个条件获取我的记录

awk'/^e20[0-9][0-9]/{d=$1fs$2fs$3;f=1;n=NR}f&&/location/$1=$1;gsub/[]/,;打印n,d,$0;f=0}'OFS='|'日志文件>>错误日志

输入错误日志文件如下所示

  1434887|E 2014-04-10 23:07:02.288|location=PIN_ERRLOC_PCP:2|class=PIN_ERRCLASS_SYSTEM_DET:1|errno=PIN_CONNECT_FAILED:114
1434896|E 2014-04-10 23:07:02.288|location=Unknown|pin|location:0|class=UNKNOWN:0|errno=PIN_CONNECT_FAILED:26
1434947|E 2014-04-10 
如果日期作为参数2014-04-03给出,则应返回与日期匹配的记录。 如果是日期和时间,则应打印从该日期的该时间开始到该日期结束的行。 若只给出给定的时间,它应该返回从该时间到文件结束的记录。
您可以尝试以下Perl脚本:

#! /usr/bin/perl

use v5.12;
use File::Slurp qw(read_file);
use Getopt::Long;
use Time::Piece;

my ($date,$time)=getOpts();

my @lines=read_file('errorlog');

if (defined $date && ! defined $time) {
    for (@lines) {
        print if $date eq @{[split(" ")]}[1];
    }
}
elsif (defined $date && defined $time) {
    for (@lines) {
        my $tmp=@{[split(/\|/)]}[1];
        my ($a,$b)=$tmp=~/E (.*?) (.*)\./;
        print if ($date eq $a && $time le $b);
    }
}
elsif (defined $time) {
    $date = localtime->strftime("%Y-%m-%d");
    for (@lines) {
        my $tmp=@{[split(/\|/)]}[1];
        my ($a,$b)=$tmp=~/E (.*?) (.*)\./;
        print if ($date eq $a && $time le $b) || ($date lt $a);
    }
}

sub getOpts { 
    my $date;
    my $time;

    GetOptions (
        "date=s" => \$date,
        "time=s" => \$time
        );
    return ($date,$time);
}

运行示例:p.pl-date=2014-04-03-time=15:07:15

我用一个简单的shell脚本找到了一个解决方案,它工作正常

/usr/bin/env bash

input_file=input.txt

awk'/^E/{a=substr$0,1,24;n=NR}NR==n+2&&n{print n,a,$0}'日志文件>$input\u文件

如果[$echo$1 | wc-m-gt 11-ax${2}==x];然后 ts=$1 其他的 日期=$1 ts=2美元 fi

如果[x${ts}!=x-a x${date}!=x];然后

    grep ${date} ${input_file} | sed -n '/'"${ts}"'/,$p'
elif[x${ts}!=x-a x${date}==x];然后

    grep ${date} ${input_file} | sed -n '/'"${ts}"'/,$p'
    sed -n '/'"${ts}"'/,$p' ${input_file}
否则


fi

对于案例三,输出应从什么日期开始?第一个有那个时间的日期还是最后一个有那个时间的日期?@Etan Reisner:对于案例3,我只给出23:07:02的时间,然后它应该取系统当前日期并获取大于或等于23:07:02的行,直到文件结束。我需要shell脚本文件plz解释你在回答中使用的命令。我是壳牌公司的新手。与你似乎相信的相反,StackOverflow并不是让别人为你工作。它是关于试图解决编程问题,包括在问题中包含代码,以及您得到的任何错误MSG、输出和有关输出不符合您的要求的原因的注释。祝你好运。输入的awk命令正确吗?还是缺少一个{after/location/?第三种情况会在您获得今天的日期后立即成为第一种情况。之后,它只是一个适当的grep命令。中间的情况需要更多的工作,但我相信如果您想走这条路,awk范围表达式将为您带来很多繁重的负担。否则,它会变得更加复杂。iam runn正在作为sriperl.pl-date=2014-04-03运行,但找不到错误命令。我已将chmod设置为文件的755。@Srini您给perl脚本起了什么名字?也许您可以尝试在脚本名称前添加一个....Like:./sriperl.pl-date=2014-04-03@Håkon Hægland:它正在执行,但没有显示任何输出。errolog文件是当前的工作目录ectory@Srini您能将错误日志文件粘贴到pastebin.com吗?然后我将尝试在我的计算机上运行它。.Haegland:-我已粘贴到标题为“Srini errorlog”的站点,我想处理该文件中的要求。