2016-01-21 73 views
-1

输入是git中的多个yaml文件:grep -v with perl one liner

例如,配置/ conf目录/主机/ ghf04.lmn /发动机1.yaml

ports: 
    ajp: 8010 
    http: 8011 
    shutdown: 8012 
apps: 
    - null 
    - Michael 
    - Hardy 

我有这样的事情在应用程序中提取数据:

for j in a b 
do 
for i in 01 02 03 04 05 06 07 08 09 10 
do 
    echo $j$i 
       ssh $j$i 'grep -P ".+(- .+)" abc/engine*yaml | perl -pe "s|\abc\/(ghf\d{2})\.lmn\/(engine-\d{1,2}).yaml:.+- (.+)|\1;\2;\3|g" |sort' 

done # end CM  

这给了我一个输出形式为:

a04 
ghf04;engine-1;null 
ghf04;engine-1;Michael 
ghf04;engine-1;Hardy 

我想从grep循环中删除包含null的行。那么我在哪里把grep -v放在perl命令中呢?试了几件事情像下面,但没有工作:

ssh $j$i 'grep -P ".+(- .+)" abc/engine*yaml | perl -pe  "s|\abc\/(ghf\d{2})\.lmn\/(engine-\d{1,2}).yaml:.+- (.+)|\1;\2;\3|g" |grep -v ghf.+null |sort' 
+4

Perl是超过能够全部由自己处理这个。如果你只是展示了一些输入,期望的输出和你的'grep |,你的问题会更清晰perl |排序'管道没有循环或'ssh'部分。 –

+0

输入是一个git yaml文件,类似于: 应用程序: - null - Michael - Hardy –

+0

请[编辑]这个问题向我们展示一个有代表性的小例子。 –

回答

1

这是一个有点哈克

find . -name *.yaml | xargs perl -e 'undef $/;for(@ARGV){open(FILE,$_),;$content=<FILE>;close(FILE);s/\.\w\w\w//g;s/^\.\///g;s/\//;/g;$content=~s/\s+-\s+null//g;$content=~s/ports.*apps:\n//sg;$content=~s/\s+-\s+(\w+)/\1 /g;@fields=split(/\s+/,$content);for $field(@fields){print "$_;$field\n";}}'