Shell 从文件中提取mac地址和nic名称的更好方法(awk)

Shell 从文件中提取mac地址和nic名称的更好方法(awk),shell,awk,grep,Shell,Awk,Grep,我有一个文本mytest.txt文件,其内容是 SUBSYSTEM==“net”,ACTION==“add”,DRIVERS==“?*”,ATTR{address}==“00:50:56:a6:4c:35”,ATTR{type}==“1”,PROGRAM=“/lib/udev/rename_device”,NAME=“eth0” 我想从上面提取mac地址和nic名称。我做这件事的方法很粗糙。这就是我正在做的。运行cat和awk两次。我想知道做这件事的更好方法是什么。另外,如果文件中有两行,我将如

我有一个文本
mytest.txt
文件,其内容是

SUBSYSTEM==“net”,ACTION==“add”,DRIVERS==“?*”,ATTR{address}==“00:50:56:a6:4c:35”,ATTR{type}==“1”,PROGRAM=“/lib/udev/rename_device”,NAME=“eth0”

我想从上面提取mac地址和nic名称。我做这件事的方法很粗糙。这就是我正在做的。运行
cat
awk
两次。我想知道做这件事的更好方法是什么。另外,如果文件中有两行,我将如何处理这两行

grep address mytest.txt|awk '{print $4}'
Output
ATTR{address}=="00:50:56:a6:4c:35",
我怎样才能以更好的方式获得MAC地址和名称,它们之间用空格隔开。此外,如果文件中有2行,则在输出中沿

<mac1> <nic_name1>
<mac2> <nic_name2>

它使用双引号作为分隔符,并打印最后第8个和第2个字段,后者由
$(NF-1)
检索
NF
是一个包含当前行字段数的awk内置程序,因此
$NF
是最后一个字段,
$(NF-1)
是最后第二个字段

样本输出:

$ cat file
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:a6:4c:35", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="10:50:56:a6:4c:35", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", NAME="eth1"
它使用双引号作为分隔符,并打印最后第8个和第2个字段,后者由
$(NF-1)
检索
NF
是一个包含当前行字段数的awk内置程序,因此
$NF
是最后一个字段,
$(NF-1)
是最后第二个字段

样本输出:

$ cat file
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:a6:4c:35", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="10:50:56:a6:4c:35", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", NAME="eth1"

您可以使用此
awk

awk -F ',[ \t]*' '{gsub(/(^| )[^=]+=+|"/, ""); print $4, $NF}' file

但是,如果您不想硬编码字段位置,那么更好的选择是处理每行并用名称-值对填充数组的awk:

awk -F ',[ \t]*|=+' '{for (i=1; i<NF; i+=2) {
gsub(/^"|"$/, "", $(i+1));
pair[$i] = $(i+1)}; print pair["ATTR{address}"], pair["NAME"]}' file

您可以使用此
awk

awk -F ',[ \t]*' '{gsub(/(^| )[^=]+=+|"/, ""); print $4, $NF}' file

但是,如果您不想硬编码字段位置,那么更好的选择是处理每行并用名称-值对填充数组的awk:

awk -F ',[ \t]*|=+' '{for (i=1; i<NF; i+=2) {
gsub(/^"|"$/, "", $(i+1));
pair[$i] = $(i+1)}; print pair["ATTR{address}"], pair["NAME"]}' file

谢谢你的回复。我可能听起来很贪婪,但我想得到这个00:50:56:a6:4c:35 eth0感谢您的回复。我可能听起来很贪婪,但我想得到这个00:50:56:a6:4c:35 eth0谢谢你的回复。-F分隔符是
我明白了。但是$(NF-1)有什么用呢?简言之,如果你能解释你的答案的话。答案肯定很有用。不客气!我在
$(NF-1)
上添加了一个解释,请查看。谢谢你的精彩回复。-F分隔符是
我明白了。但是美元(NF-1)有什么用呢。简而言之,如果你能解释你的答案。答案当然是像一个charmYou欢迎!我添加了一个关于
$(NF-1)
的解释,请查看。
awk -F ',[ \t]*|=+' '{for (i=1; i<NF; i+=2) {
gsub(/^"|"$/, "", $(i+1));
pair[$i] = $(i+1)}; print pair["ATTR{address}"], pair["NAME"]}' file
00:50:56:a6:4c:35 eth0