我们在Linux下运行命令的时候,经常会看到很多命令的输出都是分列的,作为程序员的我们经常需要取某些列来分析,awk就提供了这个比较灵活的功能。
- awk默认的列分割符是空格(多个空格也是一样),比如:
$ echo "folder1 folder2 folder3" | awk '{print $1}'
folder1
- 当然你也可以用-F option指定分割符,比如下面的命令用冒号作为分割符:
$ echo "folder1:folder2:folder3" | awk -F ":" '{print $1}'
folder1
- 分割符也可以是某个Regrex表达式,比如下面是从字符串中得到两个host name:
$ echo "hostA192.168.1.100hostB192.168.1.101" | awk -F "[0-9]+.[0-9]+.[0-9]+.[0-9]+" '{print $1; print $2}'
hostA
hostB
- 但是如果我们是在shell里先remote再执行awk命令,但需要对列前面的$进行escape,否则shell会在本地先把$2进行变量替换了,这就不是我们的本意了,比如:
ssh root@myserver "consul members | awk '{if (NR>1) {print \$2}}'"
这里就需要对$2进行转义,否则shell会将它在先本地替换成shell脚本的第二个参数的值。