awk+;awk语法中的OR操作

awk+;awk语法中的OR操作,awk,Awk,我创建了以下awk命令,以便只打印与主机和ETH参数匹配的行 我的问题是,我不知道哪个eth1-8是真正的论点 如果ETH可以是eth0、eth1或eth2…等,如何通过awk打印文件中的行,直到eth8 HOSTNAME=linux1 LAN=eth0|eth1|eth2|eth3|eth4|eth5|eth6|eth7|eth8 awk -v host=$HOSTNAME -v ETH=$LAN '$2 == host && $3 == ETH' file

我创建了以下awk命令,以便只打印与主机和ETH参数匹配的行

我的问题是,我不知道哪个eth1-8是真正的论点

如果ETH可以是eth0、eth1或eth2…等,如何通过awk打印文件中的行,直到eth8

 HOSTNAME=linux1
 LAN=eth0|eth1|eth2|eth3|eth4|eth5|eth6|eth7|eth8

 awk -v host=$HOSTNAME -v ETH=$LAN  '$2 == host && $3 == ETH'  file



 more file


192.17.200.10  linux1 eth0
192.17.200.10  linux1 eth1
192.17.200.11  linux2 eth2
192.17.200.12  linux3 eth3
192.17.200.13  linux4 eth4
192.17.200.14  linux5 eth5
192.17.200.15  linux6 eth6
192.17.200.16  linux7 eth7
192.17.200.17  linux8 eth8

使用正则表达式指定可能的匹配项,例如:

awk '$2 == "linux1" && $3 ~ /^eth[0-8]$/'
就shell变量而言,您将需要如下内容:

LAN='^eth[0-8]$'
awk -v host=$HOSTNAME -v ETH=$LAN '$2 == host && $3 ~ ETH' file
使用awk:

hostname=linux1
lan=eth

 awk -v host="$hostname" -v lan="$lan" '$2==host && ($3~lan)' yourFile
实际上,对于你的问题,grep也能起作用:

 grep -P 'linux1\s.*?eth\d' yourFile
如果要使用grep中的变量:

grep -P  "${hostname}\s.*${lan}\d" yourFile

关于grep选项–grep必须完全匹配字符串,例如匹配linux1和linux11@david你是对的。只需在${hostname}和“.”之间添加一个空格(\s)。请参阅答案中的更新。