为什么使用 awk 的这个别名不像我的其他两个那样返回干净的响应?

I a*_*oby 8 bash networking

我正在为我的终端创建一些别名以输出不同的 IP 地址。其中三分之二工作得很好,但我的默认网关不会返回干净的响应。

alias inet="hostname -I | awk '{print $3}'" 
Run Code Online (Sandbox Code Playgroud)

回报:192.168.xxx.xx按预期

alias pubip="curl ifconfig.me"
Run Code Online (Sandbox Code Playgroud)

回报:354.xxx.xx.xx按预期

但是我创建的别名是为了返回默认网关 ip

alias def="ip r | grep default | awk '{print $3}'"
Run Code Online (Sandbox Code Playgroud)

返回:default via 192.168.xxx.xxx dev eth0

我在终端中使用同一行,它只会按预期返回默认网关。

但是,当它存储为别名时,脚本的“awk”部分不起作用。

我不能在别名中使用两次管道吗?我的代码还有其他问题吗?

raj*_*raj 15

在别名定义中,$3实际上是在定义别名时展开的(尽管乍一看并非如此)。如果您alias在定义别名后键入(以查看定义的别名),您将看到您的别名实际上具有以下形式

alias def='ip r | grep default | awk '\''{print }'\'''
Run Code Online (Sandbox Code Playgroud)

并且由于print单独 in awk,因此打印了返回的整行grep

使用以下命令定义别名:

alias def="ip r | grep default | awk '{print \$3}'"
Run Code Online (Sandbox Code Playgroud)

那么你的别名将采用以下形式:

alias def='ip r | grep default | awk '\''{print $3}'\'''
Run Code Online (Sandbox Code Playgroud)

它会按照你想要的方式工作。

  • 您还可以消除 grep: `alias def="ip r | awk '/default/ {print \$3}'"` (5认同)
  • 您还可以定义一个函数而不是别名,而不必担心这些。 (4认同)