从字符串中获取最后四个字符

时间:2015-04-06 20:45:40

标签: macos command-line sed grep cut

我正在尝试从终端解析Mac序列号的最后4个字符。我可以使用此命令获取序列:

serial=$(ioreg -l |grep "IOPlatformSerialNumber"|cut -d ""="" -f 2|sed -e s/[^[:alnum:]]//g)

但我需要输出最后4个字符。

5 个答案:

答案 0 :(得分:2)

在Linux论坛echo ${serial:(-4)}

中找到它

答案 1 :(得分:1)

你也可以这样做:grep -Eo '.{4}$' <<< "$serial"

答案 2 :(得分:1)

我不知道ioreg -l的输出是怎么样的,但在我看来,你使用这么多管道来做awk单独可以处理的事情:

    use = as field separator
    vvv
awk -F= '/IOPlatformSerialNumber/ {      #match lines containing IOPlatform...
           gsub(/[^[:alnum:]]/, "", $2)  # replace all non alpha chars from 2nd field
           print substr($2, length($2)-3, length($2))   # print last 4 characters
         }'

甚至sed(自重复命令以来有点丑陋):捕获第一个=之后出现的前4个字母数字字符:

<罢工>
sed -rn '/IOPlatformSerialNumber/{
           s/^[^=]*=[^a-zA-Z0-9]*([a-zA-Z0-9])[^a-zA-Z0-9]*([a-zA-Z0-9])[^a-zA-Z0-9]*([a-zA-Z0-9])[^a-zA-Z0-9]*([a-zA-Z0-9]).*$/\1\2\3\4/;p
         }'

<击>

测试

$ cat a
aaa
bbIOPlatformSerialNumber=A_+23B/44C//55=ttt
IOPlatformSerialNumber=A_+23B/44C55=ttt
asdfasd

第一个和第二个=之间的最后4个字母数字字符是4C55

$ awk -F= '/IOPlatformSerialNumber/ {gsub(/[^[:alnum:]]/, "", $2); print substr($2, length($2)-3, length($2))}' a
4C55
4C55

答案 3 :(得分:1)

使用a shell parameter expansion提取之后的最后4个字符,但您可以一步完成所有操作:

ioreg -k IOPlatformSerialNumber | sed -En 's/^.*"IOPlatformSerialNumber".*(.{4})"$/\1/p'
  • ioreg -k IOPlatformSerialNumber返回的行少于ioreg -l,因此可以大大加快操作速度(在我的机器上快了大约80%)。
  • sed命令匹配整个感兴趣的行,并将其替换为结束该行的"之前的最后4个字符;即,它返回最后4个字符。价值。

注意:感兴趣的ioreg输出行看起来像这样:

    |   "IOPlatformSerialNumber" = "A02UV13KDNMJ"

至于原始命令:cut -d ""=""cut -d =相同 - 在=看到值之前,shell只会移除cut周围的空字符串。请注意,cut仅接受单个分隔符字符。

答案 4 :(得分:0)

如果没有你发布ioreg -l的一些示例输出,这是未经测试和猜测但看起来你需要的只是:

ioreg -l | sed -r -n 's/IOPlatformSerialNumber=[[:alnum:]]+([[:alnum:]]{4})/\1/'