我正在编写脚本的一部分,该脚本将查找 Mac 的序列号,将其存储到变量中,并根据我工作场所的命名标准重命名设备。到目前为止,我有以下内容:
% system_profiler SPHardwareDataType | grep Serial
Serial Number (system): [serial number]
我希望能够进一步过滤此输出,因此我可以将序列号存储为其自己的变量。
关于我如何做到这一点有什么想法吗?
我正在编写脚本的一部分,该脚本将查找 Mac 的序列号,将其存储到变量中,并根据我工作场所的命名标准重命名设备。到目前为止,我有以下内容:
% system_profiler SPHardwareDataType | grep Serial
Serial Number (system): [serial number]
我希望能够进一步过滤此输出,因此我可以将序列号存储为其自己的变量。
关于我如何做到这一点有什么想法吗?
您可以使用
sed
而不是grep
:.*Serial Number (system):
是一个“安全”模式,无论序列号本身的内容如何,它都会在序列号开始之前匹配目标行;我对匹配要删除的行的部分如此迂腐,因为我不清楚旧机器的序列号是否可以包含它们[A-Z0-9]
今天使用的子集之外的字符(我所知道的是他们改变了序列号的格式一些几年前)。如果您打算在“最近”的机器上使用它,其中序列号肯定是 的子集
[A-Z0-9]
,那么可以安全地贪婪地匹配所有内容,直到最后一个空格,并且该sed
命令可以缩短为:该
-n
选项将关闭所有行的输出,而该p
标志将覆盖此选项并在发生模式替换时打印替换结果。至于如何将输出存储到变量中,您可以将命令放入命令替换中:
使用
pcregrep
(不包含在 macOS 中,但可通过 Homebrew 安装),您可以执行以下操作:它将仅打印之后匹配的内容
\K
;您需要使用pcregrep
而不是grep
因为与 GNU 不同grep
,BSDgrep
没有对 PCRE(Perl 兼容正则表达式)的内置支持,并且\K
是需要 PCRE 支持才能工作的 PCRE 功能。如果您的输出确实像您所显示的那样,并且假设序列号本身是 i) 始终是该行中最后一个以空格分隔的字符串,并且 ii) 只有一行匹配
Serial
,您可以使用awk
:该
awk
命令将打印与 string 匹配的任何行上的最后一个字段(NF
是字段数,$NF
是最后一个字段的内容)Serial
。