awk调用外部变量

一、用awk 有以下几种方法去调用变量:
1.  awk ‘{print a, b}‘ a=111 b=222 yourfile
注意, 变量位置要在 file 名之前, 否则就不能调用。
还有, 于 BEGIN{}中是不能调用这些的variable. 要用之后所讲的第二种方法才可解决.
2.  awk –v a=111 –v b=222 ‘{print a,b}‘ yourfile
注意, 对每一个变量加一个 –v 作传递.
3.  awk ‘{print " ‘ "$LOGNAME" ‘ "}‘ yourfile
如果想调用environment variable, 要用以上的方式调用, 方法是:
"  ‘  "  $LOGNAME  "  ‘  "
原文:
awk如何引用外部变量
http://hi.baidu.com/icqncvjhgmbbsyq/item/02ef096ac1d49c94c5d2495a
二、进一步解释
第3种方法为什么要加两个双引号和一个单引号?
$ str=Hello
$ awk ‘BEGIN{print " ‘$str‘ "}‘
Hello
看上去是双引号套单引号,其实真正的原因为:
这是shell的功能,shell对单引号和双引号,按从左到右的顺序成对匹配
awk命令用单引号引起来,就是防止shell对其中内容进行解释
awk ‘{print " ‘$str‘ "}‘ file
实际上就是2部分
1:awk ‘{print " ‘
2:‘"}‘
即awk对2个单引号内的命令起作用。
至于$str就被shell正常解释为变量str的值。
所以,如果str=hello,则经解释后成为,awk {print "hello"}file
而如果str=hello world,则解释时,在解释前一部分:awk {print " 后,在替换了变量后,变成了hello world,当shell读到hello和world中间的空格时,认为这是IFS,于是,把他们放在于不同的域中,这样解释成了:
awk BEGIN{print "hello
world"}两部分。
按照上面的解释,就可以这么来修改,比如
a)$ awk ‘BEGIN{print " ‘ "$a" ‘ "}‘
或者
b)$ awk "BEGIN{print \"$a\"}"
或者
c)$ awk BEGIN\{print\""$a"\"\}
对于a,解释成为:
awk BEGIN{print "hello world"} #因为$a在替换后,还在“”中包括中,所以当成了一个字符串处理。
三、总结
awk怎么说也是要运行在shell环境中的。所以,写在awk中的命令,要先经过shell解析后,再交由awk来解释和执行。
本文来源:http://www.benet.wang/shell%E7%BC%96%E7%A8%8B/50.html

时间: 2024-11-23 03:16:20

awk调用外部变量的相关文章

shell if判断(曾经被一个字符串相等的判断纠结半小时,最后只是if后少了个空格!) 和 awk引用外部变量判断

一.if判断 数字: $A=12 $B=15 if(("$A"<"$B")) if(("$A"=="$B")) 字符串: $A="HELLO" $B="WORLD" if [ "$A" = "FACT_LOGIN_USER" ] if [ "$A" = "$B" ] PS:字符串比较的时候注意 'if'

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

目标:想用awk与scp命令批量传送文件 前提:先搭好主机间的免密登陆环境(参考:http://www.cnblogs.com/tankaixiong/p/4172942.html) 实现脚本方法: 1.在一个文件中记录好各个主机的端口与ip地址,第一列为主机描述信息,参考信息 [[email protected] share]# cat scp_port_ip.txt host1 33330 192.168.10.11 host2 33331 192.168.20.22 host3 33332

awk引用外部变量问题

在awk中引用外部变量会无法生效,但使用双引号时候,内置变量会不识别:解决方法是使用三引号: localhost ~]$ more awkfile this is onethis is twothis is threethis is fourthis is fivethis is sixthis is seven $ awk '{print $3}' awkfile                             $ awk "{print $3}" awkfile   one

Slickflow.NET 开源工作流引擎高级开发(一)--流程实现外部事件调用和变量存储

前言:流程实现基本流转功能外,通常也需要调用外部事件,用于和业务系统的交互,同时存储一些流程变量,用于追踪和记录业务数据变化对流程流转的影响. 1. 流程事件 流程执行过程中,伴随各种事件的发生,而且是存在于整个流程的生命周期,即从流程启动一直到流程结束的整个过程都有事件发生.这些事件的发生,业务系统通常也需要知道一些流程过程的关键节点,或里程碑状态.我们统称为流程事件. 1.1  流程事件触发类型 流程事件类型的定义是按照事件发生的位置来确定划分,跟流程直接有关的比如有:启动.运行.撤销.退回

String在方法中的传递方式(调用外部方法给String变量赋值时,未得到预期结果)

示例: public class StringTraining { public static void changeStr(String str){ str = "137878"; } public static void main(String[] args){ String a = "b"; changeStr(a); System.out.println(a); }} 输出仍旧为b 分析:首先栈中存的是堆中对象的地址,因为String对象的特殊性(Strin

Perl调用外部命令的方式和区别

主要的方式简述如下:1. system("command");使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码. 2. exec("command");效果同system命令类似,区别是不会开启子进程,而是取代父进程,因此执行完引号中的命令后进程即结束.一般和fork配合使用. 3. `command`;使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值. 4. o

Matlab调用外部库函数方法和注意事项

在MATLAB环境下访问外部函数的共享库文件,必须首先把该库文件加载到内存中.一旦加载成功,就 能直接在MATLAB中直接请求关于函数的任何信息.而当不再需要该库时,就应当及时把库文件从内存 中卸载以节省内存开销. 加载库 加载库加载库 加载库 语法:loadlibrary('shrlib','hfile') 其中shrlib为加载的动态链接库文件名(filename.dll),hfile为头文件名,它包含函数原型.例如,当加载包 含MATLAB中mx程序的libmx库时,可以使用下列语句. h

深入研究Block捕获外部变量和__block实现原理

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”.从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用.一句话来形容Blocks,带有自动变量(局部变量)的匿名函数. Block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Bl

[实用工具]Unity调用外部EXE或Shell命令

版权所有,转载须注明出处!喜欢火影.喜欢Java.喜欢unity3D.喜欢游戏开发的都可以加入木叶村Q群:379076227 1.开门见山的需求有的时候,我们想把一些外部命令集成到unity中,比如,你想通过点击Unity中的一个按钮,就更新SVN(假设该项目是受SVN管理的).那么,就涉及到一个Unity调用外部可执行文件.bat/shell等.这个需求是挺常见的,也是不难实现的. 2.简单明了的实现我们先封装一个命令调用的函数: [C#] 纯文本查看 复制代码 ? 01 02 03 04 0