使用sed从字符串中提取子字符串

时间:2017-06-29 23:59:35

标签: regex bash sed

我想从snmpwalk输出中提取MIB对象。输出FILE看起来像:

RFC1213-MIB::sysDescr.0.0.0.0.192.168.1.2 = STRING: "Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u1 (2017-06-18) x86_64"
RFC1213-MIB::sysObjectID.0 = OID: RFC1155-SMI::enterprises.8072.3.2.10
..

首先,我读取输出文件,以字符=拆分并删除RFC1213-MIB::.0之间的所有内容,直到字符串结尾。

while read -r; do echo "${REPLY%%=*}" | sed -e 's/RFC1213-MIB::\(.*\)\.0/\1/'; done <$FILE

我目前的输出:

sysDescr.0.0.0.192.168.1.2 
sysObjectID

如何删除其他值?是否有更好的解压缩提取sysDescrsysObjectID

3 个答案:

答案 0 :(得分:2)

使用awk:

awk -F[:.] '{print $3}'

(将:.定义为字段分隔符并显示第3个字段)

用sed(Gnu):

sed 's/^[^:]*::\|\.0.*//g'

(替换为空字符串,所有不是:后跟::在行的开头或第一个.0及后续字符,直到结束()

答案 1 :(得分:1)

也许你可以试试:

sed 's/RFC1213-MIB::\([^\.]*\).*/\1/' $FILE

这将获得.字符串后面的所有非点(RFC1213-MIB::)。

答案 2 :(得分:1)

如果您不想使用sed,可以使用参数替换。 sed是一个外部过程,所以它不会像参数替换一样快,因为它是内置的bash。

while IFS= read -r line; do line=${line#*::}; line=${line%%.*}; echo $line; done < file

line=${line#*::}假设RFC1213-MIB没有两个冒号,并且会从sysDescr分成两个冒号。

line=${line%%.*}假设sysDescr之后会有.

如果你有更多的例子,你认为它不会起作用,我可以更新我的答案。