如何使用“grep”和“cut”bash命令打印行的最后一列

时间:2016-11-23 09:15:04

标签: bash grep cut

我需要解析下面用粗体写的行:

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 反向等。

3 个答案:

答案 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