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

Get last four characters from a string

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

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

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

在 linux 论坛中找到它 echo ${serial:(-4)}

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

我不知道 ioreg -l 的输出结果如何,但在我看来,您正在使用如此多的管道来完成仅 awk 就可以处理的事情:

    use = as field separator
    vvv
awk -F= '/IOPlatformSerialNumber/ {      #match lines containing IOPlatform...
           gsub(/[^[:alnum:]]/, "", )  # replace all non alpha chars from 2nd field
           print substr(, length()-3, length())   # 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]).*$//;p
         }'

测试

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

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

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

如果您没有发布 ioreg -l 的一些样本输出,这是未经测试的猜测,但看起来您只需要这样的东西:

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

使用 提取最后 4 个字符 事实有效后,但您可以一步完成:

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

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

    |   "IOPlatformSerialNumber" = "A02UV13KDNMJ"

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