Perl / grep / awk - 如果语句检查第二个字符串,则拆分多个结果

时间:2011-06-03 14:23:16

标签: perl awk grep

我正在尝试为一个字符串的前2个匹配项grep一个文件(最多只有2个匹配项),包括一些上下文(grep -B 1 -A 5),将每组7行分成两行根据每个集合是否包含不同的字符串来分隔变量并编写if语句。

在某些情况下,该文件可能只包含一个匹配项。

我知道如何grep两个匹配,但不知道如何将它们分成单独的变量。我还可以编写一个if语句来检查变量是否为空(表示缺少第二个匹配)。我不知道如何检查每个变量以查看它是否包含第二个字符串。任何帮助都会有所帮助。谢谢!

示例:

grep -B1 -A5“分辨率:”file.txt

Color LCD:
  Resolution: 1440 x 900
  Pixel Depth: 32-Bit Color (ARGB8888)
  Main Display: Yes
  Mirror: Off
  Online: Yes
  Built-In: Yes
LED Cinema Display:
  Resolution: 1920 x 1200
  Depth: 32-Bit Color
  Core Image: Hardware Accelerated
  Mirror: Off
  Online: Yes
  Quartz Extreme: Supported

根据每个匹配集是否包含“主要显示”所需的结果:

$ mainDisplay =彩色LCD

$ secondDisplay = LED Cinema Display(或null表示没有第二场比赛)

4 个答案:

答案 0 :(得分:1)

你的文件是有效的YAML,所以如果你已经安装了YAML perl模块,这里有一个oneliner:

eval $(perl -MYAML -0777 -e '$r=Load(<>);map { exists($r->{$_}->{"Main Display"}) ? print "main=\"$_\";\n" : print "second=\"$_\";\n" } keys %$r' < filename.txt)
echo =$main= =$second=

所以,在eval之后,这里是shell变量mainsecond

或者,对于您的OS X,使用system_profiler命令:

eval $(
    system_profiler SPDisplaysDataType |\
    grep -B1 -A5 'Resolution:' |\
    perl -MYAML -0777 -e '$r=Load(<>);map { printf "%s=\"%s\"\n", exists($r->{$_}->{"Main Display"}) ? "main" : "second", $_ } keys %$r'
)
echo =$main=$second=

答案 1 :(得分:0)

my($first, $second) = split /--\n/, qx/grep -B1 -A5 foo data.text/;

答案 2 :(得分:0)

AWK:

awk -F : '
    /^[^[:space:]]/ {current = $1; devices[$1]++}
    $1 ~ /Main Display/ {main = current}
    END {
        for (d in devices)
            if (d == main)
                print "mainDisplay=\"" d "\""
            else
                print "secondDisplay=\"" d "\""
    }
'

输出

mainDisplay="Color LCD"
secondDisplay="LED Cinema Display"

你可以在shell中捕获和eval

答案 3 :(得分:0)

这是一个perl解决方案。像这样使用它:script.pl Resolution:。默认搜索是“解决方案:”。

值存储在%values中,例如:

$values{Color LCD}{Resolution} == "1440 x 900";

use strict;
use warnings;

my $grep = shift || "Resolution:";

my %values;
my $pre;
while (my $line = <DATA>) {
    chomp $line;
    if ($line =~ /$grep/) {
        my @data;
        push @data, scalar <DATA> for (0 .. 4);
        chomp @data;
        for my $pair ($line, @data) {
            if ($pair =~ /^([^:]+): (.*)$/) {
                $values{$pre}{$1} = $2;
            } else { die "Unexpected data: $pair" }
        }
    } else {
        $pre = $line;
    }
}

use Data::Dumper;

print Dumper \%values;

__DATA__
Color LCD:
  Resolution: 1440 x 900
  Pixel Depth: 32-Bit Color (ARGB8888)
  Main Display: Yes
  Mirror: Off
  Online: Yes
  Built-In: Yes
LED Cinema Display:
  Resolution: 1920 x 1200
  Depth: 32-Bit Color
  Core Image: Hardware Accelerated
  Mirror: Off
  Online: Yes
  Quartz Extreme: Supported