我需要将一系列通过管道连接在一起的命令转换为 .bashrc 中的别名

我需要将一系列通过管道连接在一起的命令转换为 .bashrc 中的别名
sudo ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

从终端运行上述命令时,会输出正确的“内部”IP 地址。当我尝试作为别名传递时,例如:

alias intip='sudo ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}''

我收到以下错误:

alias: addr: | cut -d: -f2 | awk { not found
alias: print not found
alias: } not found

我在这里做错了什么?

答案1

在重要的地方使用双引号和单引号的问题:

alias lsa="ls -l | awk '{print \$1}' "

答案2

您做错的事情是使用别名来执行比为命令指定较短名称或自动将参数传递给命令更复杂的操作。使用函数代替,您不必担心引用。

intip () {
    /sbin/ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
}

请注意,您在这里不需要 sudo,ifconfig当您只是查看时不需要权限。但在许多发行版上,您需要提供完整路径,而非 root 用户的ifconfig默认路径通常不是这样。PATH

顺便说一句,您可以完全在 awk 中进行过滤,但如果您更习惯这种方式,可以随意使用多种工具。这是一种方法:

intip () {
    /sbin/ifconfig wlan0 | awk 'sub(/^.*inet addr:/,"") {sub(/ .*/,""); print}'
}

您可以轻松地将接口名称作为函数的可选参数。

intip () {
    /sbin/ifconfig "${1:-wlan0}" |
    awk 'sub(/^.*inet addr:/,"") {sub(/ .*/,""); print}'
}

只是为了说明为什么您的别名不起作用:您用单引号来分隔别名并在别名文本中使用。口译员无法读懂你的想法,也无法看出哪些是应该的。看使用从 args 读取的命令和“未终止的引号字符串”/“意外的 EOF”从 sh (dash) 调用 bash对于一些引号内引号的情况和为什么 echo 忽略我的引号字符?了解如何通过输入四个字符在单引号字符串中有效地包含单引号'\''

答案3

或者你可以安装moreutils(至少,如果它可用于您的发行版)并使用ifdata.

$ ifdata -pa br0
172.16.1.244

当然,您可以使用 wlan0 而不是 br0。

相关内容