好的,这里有一个简单的例子;我通过三个步骤隔离主机的 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
命令中,进行错误检查。