使用包含 awk 的命令别名

使用包含 awk 的命令别名
alias ip="ifconfig eth0 | grep '255$' | awk '{print '\$2'}'"

alias使用不带参数的命令然后我得到

alias ip='ifconfig eth0 | grep '\' '255$'\'' | awk '\''{print '\''$2'\''}'\'''

但是,如果我跑步ip,我会得到

inet xxx.xxx.x.xxx netmask xxx.xxx.xxx.x broadcast xxx.xxx.x.xxx

当我运行时ifconfig eth0 | grep '255$' | awk '{print '\$2'}',我只能成功获取我的IP,就像xxx.xxx.x.xxx

我对这种状况感到困惑。你可以帮帮我吗?

答案1

经过所有那些引用地狱,你最终运行的是awk '{print }'。这是因为在别名分配中\$2是在双引号字符串中,其中反斜杠阻止扩展$2,但是当使用别名时,$2将不加引号并扩展为当前位置参数的任何内容$2,在交互式 shell 中可能为空。不带任何参数的命令print打印整个输入行。

最容易看到的是set -x

$ set -x
$ ip
+ grep '255$'
+ /sbin/ifconfig eth0
+ awk '{print }'
        inet ...  netmask 255.0.0.0  broadcast 10.255.255.255

(而且我在该接口上的网络掩码似乎错误。)

使用函数可以更轻松地完成类似的事情,因为这样您就不需要引用整个命令:

myip() {
    ifconfig eth0 | grep '255$' | awk '{print $2}'
}

然而,awk可以做 grep 所做的事情,我们可能不应该匹配255但也许inet关键字,所以:

myip() {
    ifconfig eth0 | awk '/inet/ {print $2}'
}

或者更明确一点:

myip() {
    ifconfig eth0 | awk '$1 == "inet" {print $2}'
}

这也避免了/inet/匹配也可以匹配该inet6行。

请注意,这ip另一个实用程序

答案2

我刚刚在我的电脑上复制了它,你可以试试吗

alias ip="ifconfig eth0 | grep '255$' | awk '{print \$2}'"

这对我有用。

确保source .bashrc更新后

相关内容