使用 bash 仅获取 linux 上的子网掩码

Get only the subnet mask number on linux using bash

我试过了 :

ip -o -f inet addr show | awk '/scope global/ {print }'

但是输出的 IP 地址带有子网掩码:

192.168.1.108/24

我只要号码24

这应该只输出两位或一位数字子网掩码,如 24 :

ip -o -f inet addr show | grep -Po "/\K[[:digit:]]{1,2}(?=.*scope\sglobal)"

如果你想让它输出斜杠 /24 :

ip -o -f inet addr show | grep -Po "/[[:digit:]]{1,2}(?=.*scope\sglobal)"

我在你的命令中使用了正则表达式 select /

之后的所有内容
ip -o -f inet addr show | awk '/scope global/ {print }' | grep -o '[^/]*$'

ip addr show 可以输出 JSON 数据,因此可以可靠地显式解析 jq:

ip \
  -family inet \
  -json \
  addr show |
    jq -r '.[].addr_info[0] | select(.scope == "global") | .prefixlen'

man ip:

-j, -json

Output results in JavaScript Object Notation (JSON).

使用 GNU awk,您可以使用 gensub:

txt='scope global'
ip -o -f inet addr show | \
 awk -v search="$txt" '[=10=] ~ search{print gensub(/.*\//, "", 1, )}'

这里,

  • -v search="$txt" - 将 txt 的值作为 search 变量
  • 传递给 awk
  • [=17=] ~ search - 检查整行是否匹配
  • gensub(/.*\//, "", 1, ) - 删除包括第四个字段中最后一个斜杠在内的所有内容(替换为空字符串 (""),搜索仅执行一次 (1) ).