grep -v with perl one liner

时间:2016-01-21 10:28:52

标签: bash perl

输入是git中的多个yaml文件:

e.g。配置/ 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'

1 个答案:

答案 0 :(得分:1)

有点hacky

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";}}'