我需要解析下面用粗体写的行:
line="eth1 Link encap:Ethernet HWaddr 11:11:11:11:11:11"
此行可能会有更多单词意外,例如
line="eth1 Link encap:Ethernet Extra HWaddr 11:11:11:11:11:11"
因此,为了正确解析MAC地址,我需要使用bash命令相应地解析该行。
echo $line | cut -d' ' -f5*
适用于第一行,而*echo $line | cut -d' ' -f6*
适用于第二行。所以,我只需要解析该行的最后一列。
但是,由于设备限制,我只能使用 grep 和剪切命令。不是 sed , awk , rev ,反向等。
答案 0 :(得分:3)
使用junit tenant
:
grep
使用echo $line | grep -o -E '[^ ]+$'
,可以使用基于字数的额外计算来制作解决方案,假设分隔符是空格:
cut
答案 1 :(得分:1)
如果MAC地址是空格后的最后一个字符序列,则可以使用纯Bash删除"* "
(星号和空格)模式的最长匹配:
echo "${line##* }"
您还可以从字符串中提取最后17个字符:
echo "${line: -17}"
如果您想在该行的 end 处进行严格匹配(由于.*
):
echo $(expr match "$line" '.*\(\([a-zA-Z0-9]\{2\}\:\)\{5\}[a-zA-Z0-9]\{2\}\)')
使用GNU grep
:
grep -o -P '(?:[a-zA-Z0-9]{2}:){5}[a-zA-Z0-9]{2}' <<< "$line"
在后一种情况下,您可能希望在行尾添加$
锚点。当然,你不必在这里使用字符串。您可能希望使用管道:echo "$line" | grep -o -P ...
。
答案 2 :(得分:0)
使用代字号(regEx
)运算符在bash
中单独使用=~
功能。您可以直接在命令行上运行以下命令,而不使用$
sigil。
$ line="eth1 Link encap:Ethernet HWaddr 11:11:11:11:11:11"
$ printf "%s\n" "$string"
eth1 Link encap:Ethernet HWaddr 11:11:11:11:11:11
$ [[ $line =~ .*HWaddr\ (.*)$ ]] && printf "%s\n" "${BASH_REMATCH[1]}"
11:11:11:11:11:11
额外的话
$ line="eth1 Link encap:Ethernet Extra HWaddr 11:11:11:11:11:11"
$ [[ $line =~ .*HWaddr\ (.*)$ ]] && printf "%s\n" "${BASH_REMATCH[1]}"
11:11:11:11:11:11
使用GNU grep
与-P
进行perl
样式正则表达式匹配的另一种方式。
$ grep -Po ".*HWaddr \K.*(.*)" <<<"eth1 Link encap:Ethernet HWaddr 11:11:11:11:11:11"
11:11:11:11:11:11
(和)
$ grep -Po ".*HWaddr \K.*(.*)" <<<"eth1 Link encap:Ethernet Extra HWaddr 11:11:11:11:11:11"
11:11:11:11:11:11
(或)
更简单地只是
$ echo "$line" | grep -Po ".*HWaddr \K.*(.*)"
11:11:11:11:11:11