我的输出如下:
NAME UUID TYPE DEVICE
Wired connection 1 e4249ef0-c4f0-3b64-8950-0c6be3edaca5 802-3-ethernet enp0s3
如果类型中包含wireless
,我想使用awk
选择设备名称。
Expected output:
enp0s3
但是有一个问题。 NAME
有时可以是一个单词,awk
可以将TYPE
和DEVICE
识别为field 3 & 4
。
awk '$3 ~ /wireless/{ print $4 }'
但是NAME
有时候spaces
介于两者之间,我想在应用awk
之前先处理它,否则它的行为会不稳定。如果我可以将单个空格改为" - ",它就解决了我的目的。
建议请。
答案 0 :(得分:4)
您说要打印“设备名称”,因此我们不知道您是否要打印“设备”字段或“NAME”字段,所以我们都只是在猜测。这就是为什么在任何问题中包含预期输出很重要的原因。
打印DEVICE字段:
awk '$(NF-1) ~ /wireless/ { print $NF }' file
打印NAME字段:
awk '$(NF-1) ~ /wireless/ { sub(/([[:space:]]+[^[:space:]]+){3}[[:space:]]*$/,""); print }' file
只要NAME字段本身可以包含空格,无论文件在字段之间包含什么空格,它都会起作用。
答案 1 :(得分:1)
您可以使用第一行来衡量第三个字段的开头和结尾,然后在您感兴趣的模式的后续行中搜索该字符范围:
awk 'NR == 1 { start = index($0, $3); end = index($0, $4); next }
substr($0, start, end - start) ~ /less/ { print $NF }' file