Sed 从一行中提取特定的单词

Sed 从一行中提取特定的单词,sed,awk,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 1.2.3.4 UDP 14000 我想提取以SRC=、PROTO=和DPT=开头的单词。我的目标是以这样的线条结束: Jan 8 14:12:56 kernel: S

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

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
1.2.3.4 UDP 14000
我想提取以SRC=、PROTO=和DPT=开头的单词。我的目标是以这样的线条结束:

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
1.2.3.4 UDP 14000
如果可能的话,我更喜欢使用sed、awk或类似的bash解决方案。

将sed与组一起使用:

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

单向使用
awk

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

1.2.3.4 UDP 14000
使用
Grep
: 您可以使用
grep的
perl
正则表达式来查找文本。在这里,我们用积极的眼光看待后面。由于输出显示在单独的行上,您可以使用
tr
功能将
新行
替换为
空格

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

如果输出是按固定顺序生成的,那么您可以简单地使用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美元的位置参数,你需要一些
shift
s.

你用什么语言编程?一些语言会在一个命令中分解字符串,而另一些语言可能会执行整个循环。另外,每种语言的方法都不同。另一方面,perl在这方面非常擅长。您可以用
\s*
替换
[^]*