我希望有人可以帮助我。我在文本文件中有一行看起来像这样:
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,如果可能的话。
答案 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" " "
[jaypal:~/Temp] grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" file
1.2.3.4
UDP
14000
tr
[jaypal:~/Temp] grep -Po "(?<=SRC=)[0-9.]+|(?<=PROTO=)([A-Z]+)|(?<=DPT=)([0-9]+)" file |
tr "\n" " "
1.2.3.4 UDP 14000