簡體   English   中英

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

[英]Extract substring from string with 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
..

首先,我讀取輸出文件,將其分割為character =並刪除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嗎?

使用awk:

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

(將:.定義為字段分隔符,並顯示第三個字段)

與sed(Gnu):

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

(用空字符串替換所有這不是一個:接着::在該行或第一開始.0和以下字符到行的結尾)

也許您可以嘗試:

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

這將得到RFC1213-MIB::字符串后不是點( . )的所有內容。

如果您不想使用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會有一個. 之后。

如果您有更多示例,認為您無法使用,我可以更新答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM