LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1103|回复: 12

再问awk利用外部变量[脚本解决]

[复制链接]
发表于 2004-6-24 11:21:03 | 显示全部楼层 |阅读模式

  1. str=aa
  2. echo | awk '{print "this is '$str'"}'
  3. this is aa
复制代码

变一下,

  1. str="aa bb"
  2. echo | awk '{print "this is '$str'"}'
  3. awk: cmd. line:1: {print "this is aa
  4. awk: cmd. line:1:        ^ unterminated string
复制代码

是不是awk不支持带有空格的变量呢?我的awk版本是:GNU Awk 3.1.3
发表于 2004-6-24 11:37:45 | 显示全部楼层

  1. /home/lee #awk -v str="aa bb" 'BEGIN{print str}'
  2. aa bb
复制代码
 楼主| 发表于 2004-6-24 20:50:25 | 显示全部楼层
付值后是可以了. 不知为什么一种方法不行呢? awk不是可以直接引用的吗?
发表于 2004-6-24 21:07:17 | 显示全部楼层
是shell和awk的默认的输出分隔符有关吧:
  1. /home/lee #echo $IFS

  2. /home/lee #str="aa bb cc"
  3. /home/lee #awk 'BEGIN{print "'$str'"}'
  4. awk: cmd. line:1: BEGIN{print "aa
  5. awk: cmd. line:1:             ^ unterminated string
  6. /home/lee #IFS=           
  7. /home/lee #awk 'BEGIN{print "'$str'"}'
  8. aa bb cc
复制代码
 楼主| 发表于 2004-6-24 22:27:57 | 显示全部楼层
哦,原来是这样。 lee兄, 那么在默认的IFS情况下, awk将外部变量str如何处理了呢?当IFS=(清空)后, awk对变量处理的变化又是什么呢?谢谢指教!
发表于 2004-6-24 22:48:24 | 显示全部楼层
晕!~~~ 我感觉是shell的内部域分隔符的问题,我认为当把IFS清空后,awk则把含有空格的变量$str的内容当成了一个整体来处理的,因为我们知道
shell命令行默认的分隔符是空格,tab,换行符,清空后的分割符就不是空格和tab了,而变量$str里的空格也不具备IFS的属性,而是普通的字符!
..感觉绕地慌 ;) ,还是让教主来解释解释吧,呵呵呵呵
 楼主| 发表于 2004-6-25 04:27:55 | 显示全部楼层
有点明白。主要是awk如何看待这个变量的问题...(理解中)
发表于 2004-6-25 11:13:31 | 显示全部楼层
javalee老兄说得不错。但我也不知道awk解析bash变量的过程是怎样。

建议看看awk的相应部分源代码。
发表于 2006-5-17 20:47:41 | 显示全部楼层
[20:41:38@~]$ awk -v str="aa b c " 'BEGIN{print str}'
aa b c
[20:41:57@~]$ awk -v str="aa b c " '{print str}'

[20:42:10@~]$ awk -v str="aa b c " 'END{print str}'

后两者就没有输出,awk里自定义的变量只能在BEGIN里用吗??请弟兄们为我解惑阿?
回复 支持 反对

使用道具 举报

发表于 2006-5-17 21:04:29 | 显示全部楼层
是因为没有文件给awk打开,所以只执行了BEGIN吧?

  1. /tmp$  str="aa bb"
  2. /tmp$  echo |awk '{print "this '"$str"'"}'
  3. this aa bb
复制代码

$str两边再加上双引号就可以了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表