2017-04-12 84 views
1

提取的名字可变位置的字段我行如下列:Shell脚本:如何从一个字符串

Mar 21 09:53:41 srv-1 kernel: [846595.861054] m5tomm7: IN=eth0 OUT=eth0 MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=192.168.3.202 DST=192.168.2.99 LEN=52 TOS=0x00 PREC=0x00 TTL=126 ID=8076 DF PROTO=TCP SPT=62956 DPT=5358 WINDOW=8192 RES=0x00 SYN URGP=0 

,我想提取SRCDSTPROTO,并DPT领域。

我不能依靠使用字段索引,因为它们有所不同。

+1

的[AWK解析出键值对到变量]可能的复制(http://stackoverflow.com/questions/29108949/awk-parse-out-key-value-pairs-into-variables) – tripleee

+0

你没有指明你要使用哪个外壳。如果它是一个你可以做正则表达式匹配的shell,那么你甚至不需要一个外部程序来实现你的目标。 – user1934428

回答

3
# perl -ne will loop over the input data and run the following program 
cat logfile | perl -ne ' 
    my $h = {}; # Declare a hash 
    # match all KEY=VALUE pairs in the line 
    while (m|(\w+)=(\S+)|g) { 
     $h->{$1} = $2; # Store ($1 = KEY, $2 = VALUE) 
    }; 
    print join(",",$h->{SRC},$h->{DST},$h->{PROTO},$h->{DPT}) . "\n"; 
' 

输出

192.168.3.202,192.168.2.99,TCP,5358 
+0

不需要管道,'perl -ne'...'日志文件 – zdim

2

以其-P选项与paste结合grep允许简单溶液(需要GNU实现):

$ grep -Po '\b(SRC|DST|PROTO|DPT)=\K[^ ]+' file | paste -s -d' \n' 
192.168.3.202 192.168.2.99 TCP 5358 
  • -P启用PRCEs (Perl-compatible Regular Expressions)

  • -o仅输出该行的匹配部分,每个部分匹配在其自己的输出行上。

  • \K(启用-P的功能)会删除目前为止所有匹配的内容;如果您希望输出中也包含字段名称和=(例如,SRC=192.168.3.202),请省略此选项。

  • paste命令然后加入每4行的空间,以形成一个单一的线,通过施加分离器(定界符)串,' \n',周期性 - 注意串是如何构成的正好4个字符 - 3位和一个换行 - 匹配每行提取的字段数。

相关问题