【问题标题】:Perl script to configure grep output用于配置 grep 输出的 Perl 脚本
【发布时间】:2013-03-25 16:13:21
【问题描述】:

我有一个用以下列格式分隔的日志文件:

<date>  <time> | <fruit> | <color> | <num_1> | <num_2> | <num_3>

例如:

2013-03-27  23:01:52 | apple | green | 55 | 120 | 29
2013-03-27  23:01:56 | plumb | purple | 28 | 1 | 394
2013-03-27  23:01:59 | apple | red | 553 | 21 | 7822

我想编写一个 perl 脚本(尽管 python 或 bash 也是可以接受的),greps&lt;date&gt;&lt;time&gt; 字段(第 1 列)和 &lt;num_1&gt;&lt;num_2&gt; 或 @ 之外987654328@,取决于你给脚本的输入。因此,在上述信息上运行perl extract.pl 2 将为您提供&lt;date&gt;&lt;time&gt;&lt;num_2&gt;

2013-03-27  23:01:52 | 120
2013-03-27  23:01:56 | 1
2013-03-27  23:01:59 | 21

我尝试了以下方法,但似乎不起作用:

#!/usr/bin/perl

use warnings;
use strict;

my $col = $1;

print `grep "myapplog.txt" "m/_(\d{4})(\d\d)(\d\d)/ | $col"`

在这里,我将col var 设置为脚本的第一个参数,然后尝试打印与第一列的日期时间和期望&lt;num_X&gt; 列匹配的grep。有任何想法吗?提前致谢。

【问题讨论】:

  • $1 不是脚本的第一个参数。那将是$ARGV[0]$1 是第一个正则表达式捕获缓冲区的内容。

标签: perl bash grep


【解决方案1】:

尝试在 awk 模式下使用 perl

$ perl -F'\|' -lane 'print $F[0]," | ", $F[4]' input
2013-03-27  23:01:52  |  120 
2013-03-27  23:01:56  |  1 
2013-03-27  23:01:59  |  21 

纯 awk:

awk -F"|" '{print $1, "|", $5}' input

纯 bash:

#!/bin/bash

IFS="|"

while read -a ARRAY;
do
    echo ${ARRAY[0]} "|" ${ARRAY[4]}
done < input

更新

通行证例如awk 解决方案的参数,用于确定要打印的女巫列,使用:

$ awk -vcol="5" -F"|" '{print $1, "|", $col}' input

在 bash 中,函数/脚本的第一个参数位于 $1,因此将其用作 ARRAY 的索引。

比单线更正式的东西,使用 python:

#!/usr/bin/env python

import sys

col = raw_input('which column to print? -> ')
try:
    col = int(col)
except ValueError:
    print >> sys.stderr, "That was no integer"

with open("input") as fd:
    for line in fd:
        tmp = line.strip().split('|')
        print tmp[0], "|", tmp[col]

【讨论】:

  • 感谢@Fredrik Pihl (+1) - 我会对 perl-awk 组合感兴趣,但应该提到我的日志文件很大,并且不只包含那 3 行日志条目.所以看起来你的第一个建议(perl-awk)被排除在外。对于另外两个,我没有偏好,但不知道如何从命令行调用它们以及将它们作为输入提供什么。再次感谢!
【解决方案2】:

试试这个

按照您的意愿使用第一个参数(使用 @ARGV 数组,而不是 perl 中的 $1):

#!/usr/bin/perl

use warnings; use strict;
use autodie; # No need to check open() errors

$\ = "\n";   # output record separator (no need \n)

# file-handle
open my $fh, "<", "myapplog.txt";

chomp(my $col = $ARGV[0]);

die("Not an integer !\n") unless $col =~ /^\d+$/;

# using the famous and magical <diamond> operator:
while (<$fh>) {
    chomp;
    my @F = split /\|/; # splitting current line in @F array
    print join("|", @F[0,$col+2]); # join on a array slice
}

close $fh;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多