想要将输出转换为变量,从第一行想要每次都取最后一个结果。
There are 1 server(s) in cluster: SQL_GDM
MS_SQL_sql1.local.com---RUNNING
There are 2 server(s) in cluster: MONGO_GDM
MS_MONGO1_mongo1.local.com---RUNNING
MS_MONGO2_mongo2.local.com---RUNNING
预期观点:
SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING
现在我只使用服务器的状态:
grep -oP '(?<=---)\w+'
我想知道如何删除MS _ * _并且只保留主机,之后要grep服务器的状态。
答案 0 :(得分:5)
awk的一种方法。它使用正则表达式来分割字段,一个或多个连字符(-+
)或冒号后跟可选空格字符(:[[:space:]]*
)。这样就更容易找到集群和状态。对于服务器,我使用_
拆分并提取最后一条路径。
script.awk
的内容:
BEGIN {
FS = "-+|:[[:space:]]*"
}
$0 ~ /:/ {
cluster = $NF
next
}
{
n = split( $1, server, /_/ )
printf "%s|%s|%s\n", cluster, server[ n ], $NF
}
像以下一样运行:
awk -f script.awk infile
它产生了:
SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING
答案 1 :(得分:4)
您可以通过sed
管道输出来删除MS _ * _echo "MS_MONGO1_mongo1.local.com---RUNNING" | sed "s/^MS_.*_//"
或创建一个awk脚本convert.awk
/cluster:/{ cluster = $NF; }
/^MS_/{
gsub("---","|");
gsub("^MS_.*_","");
printf("%s|%s\n", cluster,$0);
}
并通过
管道输出awk -f convert.awk
答案 2 :(得分:4)
这是一种方式:
$ awk '/^There/{a=$(NF-1)"_"$NF;next}{print a,$3,$NF}' FS='[ _-]' OFS='|' file
SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING
<强>解释强>
FS='[ _-]'
将每个记录分隔为使用空格,下划线和连字符作为字段分隔符的字段。OFS='|'
使用管道符号分隔输出字段。 /^There/{a=$(NF-1)"_"$NF;next}
如果该行以There
开头,则会在变量a
中存储由下划线分隔的最后两个字段,并抓住下一行。{print a,$3,$NF}
对于未启动的行There
打印a
的值,第三个字段和最后一个字段。 答案 3 :(得分:4)
perl -lne 'if(/cluster: ([\S]*)/){$a=$1}elsif(/_.*_(.*?)---(.*)/){print "$a|$1|$2"}' your_file
在下面测试
> cat temp
There are 1 server(s) in cluster: SQL_GDM
MS_SQL_sql1.local.com---RUNNING
There are 2 server(s) in cluster: MONGO_GDM
MS_MONGO1_mongo1.local.com---RUNNING
MS_MONGO2_mongo2.local.com---RUNNING
> perl -lne 'if(/cluster: ([\S]*)/){$a=$1}elsif(/_.*_(.*?)---(.*)/){print "$a|$1|$2"}' temp
SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING
答案 4 :(得分:2)
玩具示例:
use strict;
use warnings;
my $inputFile = shift(@ARGV);
open (my $input, $inputFile);
my $cluster = undef;
while(<$input>)
{
chomp;
if ($_ =~ /^There are \d+ server\(s\) in cluster: (\w+)$/)
{
$cluster = $1; #keeps track of current cluster
}
else
{
$_ =~ s/.*_.*_//; #removes the underscores and non-sense associated with them
if ($_ =~ /---([A-Z]+)/)
{
my $temp = $1; #extracts RUNNING or NOT_RUNNING, or what have you
$_ =~ s/---$temp//; #removes hypens/STATE from $_
print "$cluster|$_|$temp\n";
}
}
}
评论在代码中。我假设每行有一个条目。如果您将输入放入文件并将其打开为$input
,它将生成您所需的确切输出。如果您需要更多解释,请发表评论。