【问题标题】:Extract specific words from a line从一行中提取特定单词
【发布时间】:2012-02-05 08:48:23
【问题描述】:

我希望这里有人可以帮助我。我在文本文件中有一行如下所示:

Jan  8 14:12:56 kernel: SRC=1.2.3.4 DST=255.255.255.255 LEN=104 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=UDP SPT=44224 DPT=14000 LEN=84

我想提取以 SRC=、PROTO= 和 DPT= 开头的单词。我的目标是最终得到一条看起来像这样的线:

1.2.3.4 UDP 14000

如果可能的话,我希望解决方案是使用 sed、awk 或类似的 bash。

【问题讨论】:

  • 你用什么语言编程?有些语言会在一个命令中分解字符串,而另一些语言可能会占用一个完整的循环。另外,每种语言的方法都不同。附: perl 非常擅长这种事情。

标签: sed awk


【解决方案1】:

如果输出是按固定顺序生成的,那么您可以简单地使用 shell 内置函数。

grep SRC= /var/log/messages |
while read mon day time kernel src dst len tos prec ttl id if proto spt dpt etc; do
    echo ${src#*=} ${proto#*=} ${dpt#*=}
done

如果你有 $string 中的数据并且你想要的参数在固定位置,你也可以

set -- $string
echo ${5#SRC=} ${13#PROTO=} ${15#DPT=}

如果您的 shell 无法处理超过 $9 的位置参数,您将需要一些 shifts。

【讨论】:

    【解决方案2】:

    将 Sed 与组一起使用:

    sed -r 's/.*SRC=(\S+).*PROTO=(\S+).*DPT=(\S+).*/\1 \2 \3/'
    

    【讨论】:

    • 您可以将[^ ]* 替换为\S*
    【解决方案3】:

    使用Grep:

    您可以使用grep's perl 正则表达式来查找文本。在这里,我们用积极的眼光看后面。由于输出显示在单独的行上,您可以使用tr 函数将new line 替换为space

    grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" INPUT_FILE | 
    tr "\n" " "
    

    测试:

    步骤:1:使用 grep

    [jaypal:~/Temp] grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" file
    1.2.3.4
    UDP
    14000
    

    步骤:2:将输出连接到tr

    [jaypal:~/Temp] grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" file | 
    tr "\n" " "
    1.2.3.4 UDP 14000 
    

    【讨论】:

      【解决方案4】:

      一种使用awk的方式:

      awk 'BEGIN { FS = "[ =]" } { print $7, $22, $26 }' infile
      

      输出:

      1.2.3.4 UDP 14000
      

      【讨论】:

        猜你喜欢
        • 2020-10-08
        • 2023-01-26
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2014-12-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多