如何链接 awk 打印语句?

如何链接 awk 打印语句?

好的,这里有一个简单的例子;我通过三个步骤隔离主机的 IPV4:

ip -br a  
lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0             DOWN           
wlan0            UP             192.168.0.101/24 fe80::9fcd:45fb:1e0f:a1cc/64 
ip -br a | awk '/wlan0/ {print $3}'  
192.168.0.101/24
ip -br a | awk '/wlan0/ {print $3}' | awk -F '/' '{print $1}'
192.168.0.101

而不是调用第二个实例awk(将一个实例的输出通过管道传输到下一个实例);怎样才能一次性完成所有操作?


只想说:问题不在于解析的输出ip。我只是需要一个简单的例子来帮助说明这个问题;这是我想到的第一件事。真正的问题总结在标题中。

无论如何,无论它有什么价值(我必须检查一下,但我很确定);这是我(最近)所做的事情:

ip -br a s dev wlan0 | awk -F '[ /]*' '{print $3}'
192.168.0.101

答案1

您可以使用子集例如:

ip -br a | awk '/wlan0/ {gsub(/\/.*/, ""); print $3}'

答案2

只需更改字段分隔符的定义以包含空格和/

$ ip -br a | awk -F'[[:blank:]/]+' '/wlan0/{print $3}'
192.168.0.101

该选项-F'[[:blank:]/]+'告诉 awk 使用空格、制表符或斜杠的任意组合作为输入的字段分隔符。

答案3

对于此实例,最简单的方法可能是使用正则表达式设置多个分隔符:

ip -br a | awk -F '[\t /]*' '/wlan0/ {print$3}'

这会使字段分隔符成为任意字符串/、空格或制表符,然后打印第三个字段。

做任何事随意的如果你想学习两个命令,你几乎需要学习完整的 awk 编程语言。我不建议你这样做——我相信你有更好的事情要做。

答案4

这在某种程度上符合Stephen Rauch 的回答乔的回答,但更好:

awk '/wlan0/ {split($3, a, "/"); print a[1]}'

这将获取第三个字段 ( $3) 并将split其设置/为分隔符。组件进入数组a,并返回子字段的数量。(在此代码片段中,我忽略了返回值。) 第三个字段的a[1]第一个/- 分隔的子字段也是如此。

这比其他答案更容易推广。例如,如果你的输入是

一个阴沉的午夜,我疲惫不堪地沉思着,
在许多被遗忘的古怪而又令人好奇的传说中——
wlan0 foo/bar 那只/快/棕色/狐狸/跳过了那只懒惰的/狗
正当我打瞌睡,点头的时候,突然传来一阵敲击声,
就像有人在轻轻地敲我的房门。

然后命令

awk '/wlan0/ {if (split($3, a, "/") < 4) print "There is no fourth subfield";
                                    else print "The fourth subfield is", a[4]}'

将打印第三行 ( fox) 的第三个字段的第四个子字段,在检查返回值以split 验证至少有四个子字段后。即,这就像

awk '/wlan0/ {print $3}' | awk -F '/' '{print $4}'

在单个awk命令中,进行错误检查。

相关内容