我是新手awk
,我尝试了网上找到的许多建议,但无法解决我的问题。我需要变量$number
在 -F arg 值内进行评估。
该语句按预期工作:
inn=$(ip ad)
vth=$(echo $inn | awk -F ' 6: |@' '{print $2}')
echo $vth
但我需要提取这个“6”并相应地改变它的值,我该怎么做?
这是我最好的猜测,但它不起作用:
inn=$(ip ad)
vth=$(echo $inn | awk -vn="$number" -F ' n: |@' '{print $2}')
echo $vth
更新:我尝试了@Archemar 提供的解决方案。
它在控制台中运行得很好,但是当我将其添加到文件中时,它不起作用?为什么?变量的评估有何不同.sh文件并直接执行安慰?
编辑:1)添加 $inn 2)在控制台和 .sh 文件中执行之间的区别
答案1
这看起来更像是一个外壳问题,你尝试过吗..?
vth=$(echo "$inn" | awk -F ' '"$number"': |@' '{print $2}')
- 确保你的 shell 是 bash (例如第一行是
#!/bin/bash
) - 如果您不需要
$inn
其他地方,请使用vth=$( ip ad | ... )
- 我无法重现(或)
@
的结果ip a s
ip ad
捕获$number
我会使用的LAN 接口名称编号
vth=$(ip a s | awk -F'[: @]' -v n="$number" '$1 == n { print $3 ; exit; }' )
请注意, 的结果ip a s
并不意味着可解析。
有一个-j
选项ip
可以生成一个 json 脚本,该脚本可能更容易使用jq
实用程序进行解析。
答案2
使用BEGIN
块:
awk -v n="$number" 'BEGIN {FS=" " n ": |@"}'
所以你的就变成了:
vth=$(echo "$inn" | awk -v n="$number" 'BEGIN {FS=" " n ": |@"} {print $2}')