【问题标题】:Reading between the lines (perl or awk)行间读取(perl 或 awk)
【发布时间】:2011-08-04 01:25:45
【问题描述】:

大家好,很抱歉在这里发布这个我无法在任何地方找到答案,我的解决方案也不起作用。我有一个正在以下列方式写入的日志文件(不要问):

=============================

04-12-2011 11:37:10 SOMETHING_GOES_HERE

Variable1

Something Goes Here

=============================

04-12-2011 11:37:20 SOMETHING_GOES_HERE

Variable2

Anything different may be here

=============================

04-12-2011 11:37:30 SOMETHING_GOES_HERE

Variable3

is altogether different here

=============================

我想做的(在 perl 或 awk 中,因为这是一个 RTOS)是:

查看文件,如果 Variable1 存在,则从 Variable2 开始,打印等号之间的所有内容:

例如

=============================
04-12-2011 11:37:10 SOMETHING_GOES_HERE

Variable1

Mary had a little lamb

=============================
04-12-2011 11:37:20 SOMETHING_GOES_HERE

Variable2

The cow jumped over the moon
=============================

awk '/Mary had/{getline;getline;getline;print}'

只会打印

04-12-2011 11:37:20 SOMETHING_GOES_HERE 

但我需要的是等号之间的所有内容。我尝试处理一个也不起作用的 perl 脚本。有什么想法吗?


好吧,这行得通(有点)

#!perl -w
use strict;

my $LOGFILE = "/home/mydir/MyTestFile";
open my $fh, "<$LOGFILE" or die("could not open log file: $!");
my $in = 0;

while(<$fh>)
{
    $in = 1 if /Variable1/i;
    print if($in);
    $in = 0 if /Variable2/i;
}

从某种意义上说,很多东西都被剥离了。现在我的另一个 q 是选择性打印 a-la awk。通常,我可以在使用以下内容之前获得该行:

echo "
test
hello
foo
bar" | awk '/foo/{print x};{x=$0}'

将打印 test,但尚未找到获取单词 test 的方法(将始终是不同的单词,但单词 foo 将始终保留)。任何接受者(顺便说一句,提前感谢)

【问题讨论】:

  • 我对@9​​87654327@ 有点迷茫。你能解释一下吗?
  • 我认为他试图在两行之间进行匹配,例如/Variable1/ ... /Variable2/
  • @Geo 那不会打印everything between the equal signs

标签: perl scripting awk while-loop sh


【解决方案1】:
local $/ = "\n=============================\n";
while (<>) {
   chomp;
   ...
}

替代方案:

my $rec = '';
while (<>) {
   if (!/^=============================$/) {
      $rec .= $_;
      next;
   }

   ...

   $rec = '';
}

$/, chomp

【讨论】:

    【解决方案2】:

    我不完全清楚“Variable1/2”等是常量字符串还是实际变化的数量,但这是否有效:

    if [ $(grep Variable1 $file | wc -l) -gt 0 ]; then
      sed -n '/Variable2/,/=======/' $file
    fi
    

    【讨论】:

    • 你想要if grep -q Variable1 $file; then ...
    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多