从一行中提取特定单词

时间:2012-01-08 13:25:32

标签: sed awk

我希望有人可以帮助我。我在文本文件中有一行看起来像这样:

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,如果可能的话。

4 个答案:

答案 0 :(得分:7)

将Sed与群组一起使用:

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

答案 1 :(得分:2)

使用awk的一种方式:

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

输出:

1.2.3.4 UDP 14000

答案 2 :(得分:1)

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

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美元以上的位置参数,你需要几个shift

答案 3 :(得分:0)

使用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