在linux的alias中使用awk遇到的问题

场景很简单, 通过一个命令别名(alias)直接输出当前的机器的ip地址.

不需要使用ifconfig命令, 用ping就可以了. (更简单用 hostname -i 命令即可.)

ping -c 1 命令用来指定只ping一次, 后面是机器名或者域名.

查看机器名的命令是 hostname, 所以很简单, 直接

ping -c 1 `hostname`

就可以得到ip地址的信息了.

PING jiacheo (192.168.0.22) 56(84) bytes of data.
64 bytes from jiacheo (192.168.0.22): icmp_seq=0 ttl=64 time=0.034 ms
--- jiacheo ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0m
rtt min/avg/max/mdev = 0.034/0.034/0.034/0.000 ms, pipe 2

然后我只需要显示第一行的 (192.168.0.22)就可以了. 这时需要用到awk

ping -c 1 `hostname` | awk '{if(NR==1) pirnt $3}'

执行结果:

(192.168.0.22)

貌似没什么问题.

使用alias:

编辑~/.bashrc 文件, 最后加入

alias ip="ping -c 1 `hostname` | awk '{if(NR==1) pirnt $3}'

保存后, source ~/.bashrc 一下(或者重新登录终端)

在命令控制台敲入: ip  回车后显示

PING jiacheo (192.168.0.22) 56(84) bytes of data.

奇怪了, 开始怀疑是awk没有识别出分隔符.
后来想想, 在.bashrc里面定义的 环境变量都是可以用$var 来引用的, 这里的$是不是需要转义
在英明伟大神武牛叉轰轰的 莹莹的指导下, 果然是$符号的问题, 要转义一下就可以了. 转义的方法就是 在前面加个\

alias ip="ping -c 1 `hostname` | awk '{if(NR==1) pirnt \$3}'"

输出结果:

(192.168.0.22)

蛋疼扯了这么多, 就说明一个道理, 在定义alias的时候, 要注意特殊符号需要转义. 嗯.