在bash中仅更改单个字符之间的单个空格

时间:2018-05-11 11:09:34

标签: shell awk sed

我的输出如下:

NAME                UUID                                  TYPE            DEVICE 
Wired connection 1  e4249ef0-c4f0-3b64-8950-0c6be3edaca5  802-3-ethernet  enp0s3 

如果类型中包含wireless,我想使用awk选择设备名称。

Expected output:
enp0s3

但是有一个问题。 NAME有时可以是一个单词,awk可以将TYPEDEVICE识别为field 3 & 4

awk '$3 ~ /wireless/{ print $4 }'

但是NAME有时候spaces介于两者之间,我想在应用awk之前先处理它,否则它的行为会不稳定。如果我可以将单个空格改为" - ",它就解决了我的目的。

建议请。

2 个答案:

答案 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