题目

[root@localhost ~]# cat 1.txt
iii
sss
ddd

  

执行命令

[root@localhost ~]# A=0
[root@localhost ~]# awk '{print $$A}' 1.txt
iii
sss
ddd

  

按道理应该是语法错误,正确的应该这样写

awk '{print $'$A'}' 1.txt

  

在awk中,$是有特殊含义的字符,会被解释成字段操作符

awk '{print $$A}' 相当于 awk '{print $($A)}' => awk '{print $0}'

================================================================
为了跟清楚的解释,新建urfile,这样就能看出区别了

[root@localhost ~]# cat urfile
iii 1
sss
ddd
[root@localhost ~]# awk '{print $$A}' urfile
iii 1
sss
ddd
[root@localhost ~]# cat urfile
1 iii
sss
ddd
[root@localhost ~]# awk '{print $$A}' urfile
1
sss
ddd

  

再看awk '{print $$A}' 相当于 awk '{print $($A)}'这句话,就能理解了

这里($A)解释为第A个字段,而A在awk中是未设置的变量,数值为0

[root@localhost ~]# echo | awk '{print A}'

[root@localhost ~]# echo | awk '{print A+0}'
0

  

$0在awk中表示整行,而awk又是行处理器
所以得出
$$A => $($A) => $($0) => $("1 iii")
这个结果

最后$("1 iii") => $1

[root@localhost ~]# awk '{print $"1 iii"}' urfile
1
sss
ddd
[root@localhost ~]# awk '{print $1 iii}' urfile
1
sss
ddd

  

在awk中,"1 iii",被分割成'1','iii'两段,
空格(space) 是 awk 的字符串连接操作符。

print $1 iii       #表示将$1跟iii连接打印出来
iii,没有引号就是当作变量名

[root@localhost ~]# awk '{print iii}' urfile 

[root@localhost ~]# awk '{print $1 12}' urfile
112
sss12
ddd12
[root@localhost ~]# awk '{print $iii iii}' urfile
1 iii
sss
ddd
[root@localhost ~]# awk '{print $iii "iii"}' urfile
1 iiiiii
sssiii
dddiii
[root@localhost ~]# awk -viii=1 '{print $1 iii}' urfile
11
sss1
ddd1
[root@localhost ~]# awk -viii=iii '{print $1 iii}' urfile
1iii
sssiii
dddiii

  

连起来理解就是[print $1 iii] print$1空格(连接符)iii(awk内置变量,未设置,为空)

最后南宁@黑哥给了关于awk中变量的理解

[root@localhost ~]# echo "foo bar foobar" | awk '{A=1;print "A:"A;print "$A: "$A}'
A:1
$A: foo

  

感谢南宁@黑哥的指导

awk内引用shell变量【自己手动加精】的更多相关文章

  1. awk中引用shell变量的方法

    1.通过命令行参数定义变量时引用: awk -v awk变量名= shell变量名 #!/bin/bash var4bash=test awk -v var4awk="$var4bash&q ...

  2. awk中引用shell变量执行替换的脚本

    遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [root@154 home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 PO ...

  3. awk中使用shell变量

    方法:使用-v参数. 对于多个shell变量使用多个-v 有个关于shell变量中的空格问题:

  4. 正则表达式中引用shell变量

    注意,是用单引号包含双引号来引用变量 > MAPPING_ID_PO="000001:AP1-TU1000002:AP1-TU2000003:AP1-TU3000004:AP1-TU4 ...

  5. javascript深入理解js闭包【手动加精】

    http://www.jb51.net/article/24101.htm 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.   一.变量的作用 ...

  6. awk使用shell变量

    awk使用shell变量  (可以计算浮点数) 其实在awk里,是不能直接使用shell变量的 方法是:awk -v 选项让awk 里使用shell变量 TIME=60 awk -v time=&qu ...

  7. awk引用外部变量及调用系统命令方法

    目标:想用awk与scp命令批量传送文件 前提:先搭好主机间的免密登陆环境(参考:http://www.cnblogs.com/tankaixiong/p/4172942.html) 实现脚本方法: ...

  8. Shell awk文本处理,shell脚本编写

    Shell awk文本处理,shell脚本编写 一:内容包含awk.变量.运算符.if多分支 <a>语法糖: awk [options] 'commands' files option - ...

  9. linux中shell变量$#,$@,$0,$1,$2的含义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

随机推荐

  1. D3D中一些接口的变化和VS配置关联的方法

    一.一些改变 #include <xnamath.h> 改为了 #include <DirectXMath.h> 二.vs关联 步骤: 1.选择工程的Properties, 2 ...

  2. linux下编译安装nginx

    1.首先下载稳定版nginx1.10.2 使用wget命令下载 wget http://nginx.org/download/nginx-1.10.2.tar.gz 2.然后解压 tar -zxvf  ...

  3. mysql行列转换方法总结

    这是一道行转列并且构造交叉表的问题: http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html 数据样 ...

  4. Ajaxfileupload 总结(包括插件处理json格式bug的解决方案)

    Ajaxfileupload 是一款轻量级js的上传插件,简单容易上手,今天简单学习了下. 1,引用jquery和Ajaxfileupload .js <script src="~/S ...

  5. 使用WebGL加载Google街景图

    我们要实现的功能比较简单:首先通过坐标定位.我的位置.地址搜索等方式,调用google map api获取地址信息.然后根据地址信息中的全景信息获取当前缩放级别的全景信息.最终把这些全景信息通过Web ...

  6. vim - manual -个人笔记

    ##vim配置 ###normal > 输入命令:w 写入保存 > > 粘贴 :p(向下粘贴) P(大写向上粘贴) > > 复制 :yy 复制一行 > > 删 ...

  7. 精准准确的统一社会信用代码正则(js)

    参照标准: <GB_32100-2015_法人和其他组织统一社会信用代码编码规则.> 按照编码规则: 统一代码为18位,统一代码由十八位的数字或大写英文字母(不适用I.O.Z.S.V)组成 ...

  8. Git版本控制,rsync同步文件,完成线上部署

    之前项目开发完成,测试阶段,借着此时,由于公司暂时用两台aliyun  ecs  做业务层,所以每次都需要同步线上文件,进而想着搞一搞服务器端(小公司,新项目,先小搞一把),搭建一套小的版本控制上线的 ...

  9. PHP 底层的运行机制与原理 --转

    发现一片总结的还不错的文章,记录一下 PHP说简单,但是要精通也不是一件简单的事.我们除了会使用之外,还得知道它底层的工作原理. PHP是一种适用于web开发的动态语言.具体点说,就是一个用C语言实现 ...

  10. Java Class Loader

    Reference: [1] http://www.cnblogs.com/kevin2chen/p/6714214.html 当调用 java命令运行一个java程序时,会启动一个java虚拟机进程 ...