从字符串中获取最后四个字符
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
仅接受 单个 分隔符字符。
我正在尝试从终端解析 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
(由于重复命令有点难看):捕获第一个 =
:
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})//'
使用
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
仅接受 单个 分隔符字符。