LinuxSir.cn,穿越时空的Linuxsir!

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

awk 的一个问题(已在旧贴中搜索,未找到相关答案!)

[复制链接]
发表于 2005-4-9 21:29:35 | 显示全部楼层 |阅读模式
在makefile中,有如下语句

VERSIONFILE = /usr/src/linux/include/linux/version.h
VERSION = $(shell awk -F\" '/REL/ {print $$2}' $(VERSIONFILE))


高手给详细解释一下那条awk语句吧(尤其是$$2,不明白)!非常感谢!
发表于 2005-4-9 23:35:21 | 显示全部楼层
awk 格式
awk -F\" '/REL/ {print $$2}' $(VERSIONFILE)
-Fre   -F后面紧跟分隔符,如果不加这个选项就默认空格为分隔符
'/REL/ {print $$2}'    这段格式应为'pattern {action}',因此/REL/为匹配正则表达式,这个应该明白吧,后面action print $$2,后面的$2为print内置参数是输入文件的第二列,$$2就是取出第二列的值然后再到相应列,比如$2=4,则现在为$4,即第四列
$(VERSIONFILE) 这个应该是输入的文件就是上面的/usr/src/linux/include/linux/version.h

现在明白了吗?
回复 支持 反对

使用道具 举报

发表于 2005-4-10 00:19:42 | 显示全部楼层
It is very clear.

Thank you very much.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-10 08:54:37 | 显示全部楼层
Thanks a lot!!!!!!!!
zhy2111314兄弟的讲解很详细啊!~
还有一点,就是如果$2是一个单独的数字,比如说是1,2或3等等,那么$$2就很好理解了,
但那个makefile中,实际上$2得到的是2.4.20,这么一来,$$2,具体是多少呢?
回复 支持 反对

使用道具 举报

发表于 2005-4-10 12:04:46 | 显示全部楼层
首先昨天说得有个地方有点错误,由于这两天身体不好,头脑有些发烧所以这里出现一点错误,不好意思,在这里进行指正:
$(VERSIONFILE) 这个应该是输入的文件就是上面的/usr/src/linux/include/linux/version.h

这里,$()的作用是命令的替换,比如:

  1. zhyfly@zhyfly:~$ pwd
  2. /home/zhyfly
  3. zhyfly@zhyfly:~$ a=$(pwd)
  4. zhyfly@zhyfly:~$ echo $a
  5. /home/zhyfly
  6. zhyfly@zhyfly:~$
复制代码

所以在这里$(VERSIONFILE)就相当于替换命令,VERSIONFILE应该相当于一个命令,由上面定义VERSIONFILE = /usr/src/linux/include/linux/version.h可知该命令就是执行脚本version.h(应该为可执行文件)
这是我的理解,不知道对否?
回复 支持 反对

使用道具 举报

发表于 2005-4-10 12:16:34 | 显示全部楼层

re

Do you think the .h file is a shell??????????????

I think the previous one is correct.
回复 支持 反对

使用道具 举报

发表于 2005-4-10 12:20:12 | 显示全部楼层
Post by ld_jia
Thanks a lot!!!!!!!!
zhy2111314兄弟的讲解很详细啊!~
还有一点,就是如果$2是一个单独的数字,比如说是1,2或3等等,那么$$2就很好理解了,
但那个makefile中,实际上$2得到的是2.4.20,这么一来,$$2,具体是多少呢?

这个看下面:
  1. zhyfly@zhyfly:~/bash$ cat grade.txt
  2. M.Tans 5/99 48311 Green 8 40 44
  3. J.Lulu 06/99 48317 green 9 24 26
  4. P.Bunny 02/99 48 Yellow 12 35 28
  5. J.Troll 07/99 4842 Brown-3 12 26 26
  6. L.Tansl 05/99   4712 Brown-2 12 30 28
  7. zhyfly@zhyfly:~/bash$ awk '{print $2}' grade.txt
  8. 5/99
  9. 06/99
  10. 02/99
  11. 07/99
  12. 05/99
  13. zhyfly@zhyfly:~/bash$ awk '{print $2.4.20}' grade.txt
  14. 5/990.2
  15. 06/990.2
  16. 02/990.2
  17. 07/990.2
  18. 05/990.2
  19. zhyfly@zhyfly:~/bash$ awk '{print .4.20}' grade.txt
  20. 0.40.2
  21. 0.40.2
  22. 0.40.2
  23. 0.40.2
  24. 0.40.2
  25. zhyfly@zhyfly:~/bash$
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-4-10 12:26:09 | 显示全部楼层
Post by cnspy
Do you think the .h file is a shell??????????????

I think the previous one is correct.

是吗,$()有变量替换的作用?如果有那就对了,偶记不太清了
回复 支持 反对

使用道具 举报

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

本版积分规则

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