我正在尝试从终端解析Mac序列号的最后4个字符。我可以使用此命令获取序列:
serial=$(ioreg -l |grep "IOPlatformSerialNumber"|cut -d ""="" -f 2|sed -e s/[^[:alnum:]]//g)
但我需要输出最后4个字符。
答案 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/'