Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 当行顺序为’;我事先不知道?_Shell - Fatal编程技术网

Shell 当行顺序为’;我事先不知道?

Shell 当行顺序为’;我事先不知道?,shell,Shell,networksetup-listallhardwareports命令返回MAC中所有网络设备的硬件MAC地址 当行顺序事先未知时(因此我无法使用networksetup-listallhardwareports | sed-n4p | awk'{print$3}'),如何可靠地从标准输出中提取00:0c:29:5b:14:b3 硬件端口:Wi-Fi 设备:en0 以太网地址:00:0c:29:5b:14:b3 硬件端口:蓝牙PAN 装置:en3 以太网地址:e1:7e:be:a6:0b:12

networksetup-listallhardwareports
命令返回MAC中所有网络设备的硬件MAC地址

当行顺序事先未知时(因此我无法使用
networksetup-listallhardwareports | sed-n4p | awk'{print$3}'),如何可靠地从标准输出中提取
00:0c:29:5b:14:b3

硬件端口:Wi-Fi
设备:en0
以太网地址:00:0c:29:5b:14:b3
硬件端口:蓝牙PAN
装置:en3
以太网地址:e1:7e:be:a6:0b:12

说明:此
awk
命令正在将所有多行记录转换为单行记录。这是通过取消设置(
-vrs=
)awk的默认记录分隔符(
RS
)来完成的。如果任何行(或记录)中包含
en0
字符串,则稍后进行匹配。

这里有一个稍微不同的扭曲,它不连接行,而只是使用一个简单的标志指示找到
en0
作为第二个字段,然后在下一行输出最后一个字段并退出:

networksetup -listallhardwareports | 
awk '$2=="en0" { nextmac=1; next } nextmac==1 {print $NF; exit}'
00:0c:29:5b:14:b3

这两种方法都很好,只是对我来说,处理每条记录比加入它们更容易一些。6比1等于1/2打。

您是想同时提取mac还是只提取
en0
?您是只提取
00:0c:29:5b:14:b3
还是所有mac地址?(或仅用于wifi,或仅用于蓝牙?@P。。。。仅适用于
en0
设备。@DavidC.Rankin仅适用于
en0
Wi-Fi设备。
{$1=$1;}
做什么?似乎很没用。在这种特殊情况下,它不是必需的,但是,它用于将每条记录转换为一行。@P。。。。这太神奇了。请您把它分解一下,解释一下
awk
参数是如何工作的好吗?@sunknudsen这里每个eth接口的多行记录都使用
-v RS=
转换成一行,
$NF
是mac地址,意味着每个记录的最后一个字段。我建议运行此命令以查看
RS的行为被设置为空白
networksetup-listallhardwareports | awk-v RS='{$1=$1}1'`感谢您添加到对话中。我同意另一个答案是令人费解的。实际上,这是一种巧妙的方法,它只是将每个设备的所有3行分组为一个记录(通过取消设置
RS
--记录分隔符),并在该组行中找到
“en0”
,则选择最后一个字段。文件中的空白行分隔组。
networksetup -listallhardwareports | 
awk '$2=="en0" { nextmac=1; next } nextmac==1 {print $NF; exit}'
00:0c:29:5b:14:b3