在Unix中的某些模式之后获取值

时间:2016-07-11 04:30:44

标签: shell awk grep

这是我的文字

Peer Addr 1.1.1.1, Intf Port-Channel0.1, State Up
VRF default, LAddr 1.1.1.1, LD/RD 090/592
Session state is Up and using echo function with 300 ms interval
Detect Time: 8000
Sched Delay: 1*TxInt: 3522100, 2*TxInt: 5, 3*TxInt: 0, GT 3*TxInt: 0
Registered protocols: isis bgp ospf

我想要Peer Addr,Intf和Registered protocols之后的值

预期输出

1.1.1.1 

Port-Channel0.1

isis bgp ospf

这就是我试过的

grep -oP "Peer Addr\s+\K\w+"

我无法获得所需的输出。我是shell脚本的新手,如果有人可以帮我解决这个问题,我会很高兴。我不想在一个命令中输出所有输出。我想将这些存储为三个不同的变量

4 个答案:

答案 0 :(得分:2)

使用GNU awk进行多字符RS:

var angularVersion = '2.0.0-rc.4';

System.config({
  baseUrl: '/',
  paths: {
    'npmcdn:*': 'https://npmcdn.com/*'
  }
});

System.config({
  transpiler: 'typescript', 
  typescriptOptions: { emitDecoratorMetadata: true },

  meta: {
    '*': {
      deps: [ 'zone.js', 'reflect-metadata' ]
    }
  }
});

System.config({
  packageConfigPaths: [
    "npmcdn:@*/*/package.json"
  ],

  map: {
    '@angular/core': 'npmcdn:@angular/core@'+angularVersion,
    '@angular/compiler': 'npmcdn:@angular/compiler@'+angularVersion,
    '@angular/common': 'npmcdn:@angular/common@'+angularVersion,
    '@angular/platform-browser': 'npmcdn:@angular/platform-browser@'+angularVersion,
    '@angular/platform-browser-dynamic': 'npmcdn:@angular/platform-browser-dynamic@'+angularVersion,
    'rxjs': 'npmcdn:rxjs@5.0.0-beta.6',
    'zone.js': 'npmcdn:zone.js@0.6.12',
    'reflect-metadata': 'npmcdn:reflect-metadata@0.1.3',
    "crypto": "@empty"
  },

  packages: {
    'app': {
      defaultExtension: 'ts',
      main: './index.ts'
    }
  }
});

答案 1 :(得分:1)

使用GNU grep:

grep -Po '(Peer Addr|Intf|protocols:) \K.*?(?=(,|$))' file

输出:

1.1.1.1
Port-Channel0.1
isis bgp ospf
  

-P PATTERN:将PATTERN解释为Perl正则表达式。

     

-o:仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

     

\K:如果\K出现在Perl正则表达式中,它会导致正则表达式匹配器在该点之前删除所有内容。

     

(?=...):捕获的匹配必须后跟,或行尾($),但该部分也会被删除。

答案 2 :(得分:0)

使用sed,您可以执行以下操作:

sed -rn 's/Peer Addr *([^,]+), */\1/;
         s/Intf *([^,]+),.*/\n\1/;
         s/Registered protocols: *//;
         ta;d;:a p' 

答案 3 :(得分:0)

awk -F"[, ]" '/^Peer Addr/{print $3"\n"$6} /^Registered protocols:/{sub(/Registered protocols: /,"");print}' File

此处IFS,

/^Peer Addr/{print $3"\n"$6}:如果一行以Peer Addr打印$3(此处1.1.1.1)和$6Port-Channel0.1)开头。

/^Registered protocols:/{sub(/Registered protocols: /,"");print}':如果一行以Registered protocols:开头,则在使用Registered protocols: awk函数删除字符串sub后打印整行。