LinuxSir.cn,穿越时空的Linuxsir!

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

在看linux设备驱动时的碰到的awk语句,不知道理解有没有正确,请指点。谢谢!

[复制链接]
发表于 2004-9-29 14:24:38 | 显示全部楼层 |阅读模式
在LDD2得p.71有这样得awk语句,用于获得主设备号的:
#!/bin/sh
module="scull"
......
major=`awk "\\$2==\"$module\" {print \\$1}" /proc/devices`         (*)
......

同样的功能可以用命令行来实现:
#awk '$2==/scull/ {print $1}' /proc/devices        (**)

比较(*)(**)两个命令的不同之处,是不是可以得出这样的结论:
1、在脚本中使用awk命令时,\\$n代表awk获取第n个域的值,而不能采用$n,这个在脚本中是指第n个命令参数。
2、脚本中要使用awk命令时,如要使用局部变量的值,应该以\"$module\"形式来调用,而不是直接调用$module(为何?)

以上2点是否正确呢?请指点!我没有能够找到相应的资料来证明之。


另外有个问题:
在命令行中(**)怎么不能使用环境变量呢?我是这样实现的:

#var="ttyp"
#export var
#awk '$2==$var {print $1}' /proc/devices
根本没有任何反应,只有将变量更改为"scull"时才可得出正确结果:
#awk '$2=="ttyp" {print $1}' /proc/devices
# 3 ttyp

谢谢!
发表于 2004-10-4 03:16:25 | 显示全部楼层
awk "$2==$var {print $1}" /proc/devices
发表于 2004-10-4 16:04:14 | 显示全部楼层
var=ttyp

  1. awk '$2=="'$var'"{print $1}' /proc/devices
复制代码
or

  1. awk -v dev=$var '$2==dev{print $1}' /proc/devices
复制代码

ps:这涉及到shell变量如何传递到awk中的问题!,论坛早有讨论.
awk "$2==$var {print $1}" /proc/devices

楼上的写法似乎有些想当然, ;)
 楼主| 发表于 2004-10-8 10:55:50 | 显示全部楼层

谢谢!那我对(*)的理解是否正确呢?

major=`awk "\\$2==\"$module\" {print \\$1}" /proc/devices` (*)
1、在脚本中使用awk命令时,\\$n代表awk获取第n个域的值,而不能采用$n,这个在脚本中是指第n个命令参数。
2、脚本中要使用awk命令时,如要使用局部变量的值,应该以\"$module\"形式来调用,而不是直接调用$module

******这样的理解是否正确呢?请指点!谢谢了!*************************

我把找到的“awk中如何使用shell的环境变量”文章贴一下
来自:Linux知识宝库
http://www.douzhe.com/docs/linux/
Contact: 无名

一:"'$var'"
这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.
如:
var="test"
awk 'BEGIN{print "'$var'"}'
这种写法其实际是双括号变为单括号的常量,传递给了awk.
如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
var="this is a test"
awk 'BEGIN{print "'"$var"'"}'

二:'"$var"'
这种写法与上一种类似.
如果变量含空格,则变为'""$var""'较为可靠.

三.把括起awk程序的''变为"",使用"$var"
如:
$var="this is a test"
awk "BEGIN{print "$var"}"

这是因为在""里$是特殊字符,而在''里$是普通字符.

四:export 变量,使用ENVIRON["var"]形式
如:
$var="this is a test";export $var
awk 'BEGIN{print ENVIRON["var"]}'

五:当然也可以使用-v选项
如:
$var="this is a test"
awk -vnvar="$var" '{print nvar}'
这样便把系统变量定义成了awk变量.
发表于 2004-10-8 11:22:12 | 显示全部楼层
你的理解基本是正确的,我建议在机器上多实践,实践出真知嘛
 楼主| 发表于 2004-10-8 17:06:15 | 显示全部楼层
好的!
谢谢KornLee了!
发表于 2004-10-9 01:26:16 | 显示全部楼层
最初由 twmt 发表
好的!
谢谢KornLee了!

呵呵,互相帮助,共同提高!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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