Unix - 文件名和字符串结果在同一行

时间:2014-03-31 21:34:04

标签: perl unix grep

我需要搜索一个包含数百或数千个文件的目录,每个文件包含带有一个或多个特定字符串实例的XML(带数据的开始/结束标记)。 我可以通过

获取字符串的所有实例
grep -ho '<mytagname>..............<\/mytagname>' /home/xyzzy/mydata/*.XML > /home/mydata/tagvalues.txt

然后一些sed命令剥离标签,所以我最终得到一个只包含值列表的文件:

  value001
  value002
  value003

(等)

理想情况下,我希望文件的每一行都包含文件名,以便我可以导入数据库进行分析。

所以我的结果会是这样的

fileAAA value001
fileAAA value002
fileAAA value003
fileBBB value004

上述的精确格式很灵活 - 可以有空格或其他分隔符,它甚至可以包含开始/结束标记。

我能得到的最接近的是grep -o

fileAAA:value001
value002
value003
fileBBB:value004

perl单线程看起来很理想,但我已经足够新了,我不知道如何开始。

2 个答案:

答案 0 :(得分:4)

可以使用像这样的单线程来完成:

perl -lne 'print "$ARGV $1" if /<mytagname>(.*?)<\/mytagname>/' *.xml

但是,我强烈建议您使用实际的XML解析器,例如XML::TwigXML::LibXML

use strict;
use warnings;

use XML::LibXML;

for my $file (</home/xyzzy/mydata/*.XML>) {
    my $doc = XML::LibXML->load_xml(location => $file);
    for my $node ($doc->findnodes("//mytagname")) {
        print "$file " . $node->textContent() . "\n";
    }
}

答案 1 :(得分:0)

awk怎么样?

awk -F'</?mytagname>' '$2 {print FILENAME,$2}' /home/xyzzy/mydata/*.XML

说明:

  • -F regex - set field delimiter必须是一个单独的参数,因此用自己的引号括起来
  • $2 - 如果第二个字段的值为
  • {print FILENAME,$2} - print filename SPACE第二个字段的值