我正在尝试为一个字符串的前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表示没有第二场比赛)
答案 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变量main
和second
或者,对于您的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