在上写
![](/icons/9014chengxu.gif)
、做网管
![](/icons/9014de.gif)
人
![](/icons/9014dou.gif)
或多或少都会几种脚本
![](/icons/9014dou2.gif)
脚本语言灵活
![](/icons/9014de.gif)
变量类型、强大
![](/icons/9014de.gif)
正则表达式处理能力
![](/icons/9014dou.gif)
再加上系统本身
![](/icons/9014de.gif)
管道、重定向以及丰富
![](/icons/9014de.gif)
命令行工具
![](/icons/9014dou.gif)
让你编程起来游刃有余
![](/icons/9014dou2.gif)
而C语言固然有种种优势
![](/icons/9014dou.gif)
但不可否认
![](/icons/9014dou.gif)
很多场合下
![](/icons/9014dou.gif)
用脚本语言更为方便
![](/icons/9014dou.gif)
比如我们将举例介绍说明
![](/icons/9014de.gif)
对配置文件
![](/icons/9014de.gif)
处理
先看看我们举例
![](/icons/9014chengxu.gif)
![](/icons/9014de.gif)
任务:
假设我们有
![](/icons/9014yi.gif)
个用c写
![](/icons/9014de.gif)
![](/icons/9014chengxu.gif)
![](/icons/9014dou.gif)
它有
![](/icons/9014yi.gif)
个配置文件 user.conf
![](/icons/9014dou.gif)
保存了
![](/icons/9014yi.gif)
些用户信息
![](/icons/9014dou.gif)
user.conf定义如下:
1)、以 # 开头
![](/icons/9014de.gif)
行为注释行
![](/icons/9014dou.gif)
不做处理
![](/icons/9014dou2.gif)
2)、允许空行
![](/icons/9014dou2.gif)
3)、如果不是1和2
![](/icons/9014dou.gif)
那么就是有效
![](/icons/9014de.gif)
数据
![](/icons/9014dou.gif)
格式如下
# user.conf: configure file for user
# username age sex country
tom 20 male us
chen 22 female cn
每
![](/icons/9014yi.gif)
列分为4个字段
![](/icons/9014dou.gif)
字段的间用
![](/icons/9014yi.gif)
个或多个空白
![](/icons/9014zifu.gif)
(空格或者制表符)隔开
![](/icons/9014dou.gif)
字段依次是 姓名、年龄、性别、国家
![](/icons/9014dou2.gif)
我们
![](/icons/9014de.gif)
c
![](/icons/9014chengxu.gif)
要完成对 user.conf
![](/icons/9014de.gif)
添加、删除、编辑、查询
这样
![](/icons/9014yi.gif)
个简单
![](/icons/9014de.gif)
任务
![](/icons/9014dou.gif)
用c处理起来不算复杂
![](/icons/9014dou.gif)
不过也是要花点功夫
![](/icons/9014de.gif)
![](/icons/9014dou.gif)
而如果用脚本语言来做
![](/icons/9014dou.gif)
却很简单
![](/icons/9014dou.gif)
能不能在c中
![](/icons/9014diaoyong.gif)
脚本来完成任务了?
Awk是linux上
![](/icons/9014yi.gif)
种脚本语言
![](/icons/9014dou.gif)
它
![](/icons/9014de.gif)
长处在于处理有
![](/icons/9014yi.gif)
定格式规则
![](/icons/9014de.gif)
文件
![](/icons/9014dou.gif)
例如咱们
![](/icons/9014de.gif)
user.conf
![](/icons/9014dou2.gif)
有关 awk
![](/icons/9014de.gif)
资料有很多
![](/icons/9014dou.gif)
oreilly公司出了专门
![](/icons/9014de.gif)
awk 编程
![](/icons/9014de.gif)
书籍
![](/icons/9014dou.gif)
网上也是可以到
![](/icons/9014de.gif)
![](/icons/9014dou2.gif)
你也可以直接 man awk看看
我们先看看如何用 shell 结合 awk来完成上述任务:
1) 添加
![](/icons/9014yi.gif)
条记录
例如
![](/icons/9014dou.gif)
要添加 jack 18 male us 这样
![](/icons/9014yi.gif)
条记录
![](/icons/9014dou.gif)
可以简单
![](/icons/9014de.gif)
用重定向功能
Echo –e “jack 18 male us” >> user.conf
现在
![](/icons/9014dou.gif)
这条记录被添加到 user.conf末尾了
2) 删除
![](/icons/9014yi.gif)
条记录
例如
![](/icons/9014dou.gif)
现在要删除用户 chen
![](/icons/9014de.gif)
信息
cat user.conf | awk ‘!/^chen[[:blank:]]+/ {pr
![](/icons/9014int.gif)
}’ > tmp.conf; mv –f tmp.conf user.conf
3)、编辑
![](/icons/9014yi.gif)
条记录
现在
![](/icons/9014dou.gif)
想把 tom
![](/icons/9014de.gif)
性别改为 female
cat user.conf | awk ‘{
![](/icons/9014if.gif)
($0 ~ /^tom[[:blank:]]+/) pr
![](/icons/9014int.gif)
$1 $2 female $3;
![](/icons/9014else.gif)
pr
![](/icons/9014int.gif)
}’
通过 system
![](/icons/9014kh.gif)
这个
![](/icons/9014hanshu.gif)
![](/icons/9014dou.gif)
我们就可以在 c 中
![](/icons/9014diaoyong.gif)
以上脚本
![](/icons/9014dou.gif)
完成任务了
但是
![](/icons/9014dou.gif)
system
![](/icons/9014kh.gif)
用起来还是觉得不爽
![](/icons/9014dou.gif)
它
![](/icons/9014de.gif)
不足是只能执行脚本
![](/icons/9014dou.gif)
却无法获得脚本
![](/icons/9014de.gif)
输出数据
![](/icons/9014dou.gif)
而这通常是我们进
![](/icons/9014yi.gif)
步处理
![](/icons/9014de.gif)
数据来源
![](/icons/9014dou2.gif)
(在shell和perl中
![](/icons/9014dou.gif)
可以通过反引号( `` )来取得命令
![](/icons/9014de.gif)
输出结果)
![](/icons/9014yi.gif)
个解决办法是把输出结果重定向到
![](/icons/9014yi.gif)
个临时文件中
![](/icons/9014dou.gif)
然后在c中读取文件
![](/icons/9014dou.gif)
获取数据
![](/icons/9014dou.gif)
最后当然还要删除这个文件
![](/icons/9014dou2.gif)
不过
![](/icons/9014dou.gif)
这个思路方法总是让人觉得有
![](/icons/9014yi.gif)
点点不爽
![](/icons/9014dou.gif)
如果能直接把脚本执行中输出
![](/icons/9014de.gif)
数据输到我们
![](/icons/9014de.gif)
缓冲区来就更好了
我写了个小
![](/icons/9014hanshu.gif)
![](/icons/9014dou.gif)
叫 my_system
![](/icons/9014kh.gif)
![](/icons/9014dou.gif)
通过管道以及重定向
![](/icons/9014dou.gif)
实现了以上想法
![](/icons/9014hanshu.gif)
原型如下:
![](/icons/9014int.gif)
my_system(const char* pCmd, char* pResult,
![](/icons/9014int.gif)
size);
输出数据被保存到 pResult所指向
![](/icons/9014de.gif)
缓冲区中
![](/icons/9014dou.gif)
缓冲区大小为 size
![](/icons/9014dou.gif)
最多可以保存 size-1
![](/icons/9014de.gif)
数据
![](/icons/9014dou2.gif)
![](/icons/9014hanshu.gif)
![](/icons/9014de.gif)
实现放在本文
![](/icons/9014de.gif)
最后
有了这个
![](/icons/9014hanshu.gif)
以后
![](/icons/9014dou.gif)
在 c中
![](/icons/9014diaoyong.gif)
脚本就更方便了
![](/icons/9014dou.gif)
我们可以通过它来实现对 user.conf
![](/icons/9014de.gif)
查询
4)、查询
![](/icons/9014yi.gif)
个记录
例如
![](/icons/9014dou.gif)
我们要获取 tom
![](/icons/9014de.gif)
性别
可以用脚本这样来实现:
cat user.conf | awk ‘/^tom[[:blank:]]+/ {pr
![](/icons/9014int.gif)
$3}’
脚本
![](/icons/9014de.gif)
执行结果是 tom
![](/icons/9014de.gif)
性别 male被输出到屏幕上
在我们
![](/icons/9014de.gif)
c
![](/icons/9014chengxu.gif)
中
![](/icons/9014dou.gif)
如此
![](/icons/9014diaoyong.gif)
my_system
![](/icons/9014kh.gif)
char buf[101];
my_system(“cat user.conf | awk ‘/^tom[[:blank:]]+/ {pr
![](/icons/9014int.gif)
$3}’”, buf, 101);
![](/icons/9014diaoyong.gif)
完以后
![](/icons/9014dou.gif)
buf中
![](/icons/9014de.gif)
数据就是 “male”了
![](/icons/9014dou.gif)
如何样
![](/icons/9014dou.gif)
还算方便吧?
以上只是用结合脚本完成了
![](/icons/9014yi.gif)
个比较简单
![](/icons/9014de.gif)
任务
![](/icons/9014dou.gif)
所以我没有把这些脚本单独形成脚本文件
![](/icons/9014dou2.gif)
如果你善于使用 perl、shell、awk
![](/icons/9014dou.gif)
那么可以写出更强大
![](/icons/9014de.gif)
脚本文件来处理更复杂
![](/icons/9014de.gif)
问题
![](/icons/9014dou.gif)
然后通过类似 my_system( )
![](/icons/9014de.gif)
思路方法
![](/icons/9014dou.gif)
在 c/c
![](/icons/9014jiajia.gif)
等其它语言中取得脚本
![](/icons/9014de.gif)
输出结果
![](/icons/9014dou.gif)
实现有趣
![](/icons/9014de.gif)
“混合编程”
![](/icons/9014dou2.gif)
希望你能从中得到乐趣!
#
![](/icons/9014include.gif)
#
![](/icons/9014include.gif)
#
![](/icons/9014include.gif)
#
![](/icons/9014include.gif)
#
![](/icons/9014int.gif)
my_system(const char* pCmd, char* pResult,
![](/icons/9014int.gif)
size)
{
![](/icons/9014int.gif)
fd[2];
![](/icons/9014int.gif)
pid;
![](/icons/9014int.gif)
count;
![](/icons/9014int.gif)
left;
char* p = 0;
![](/icons/9014int.gif)
maxlen = size – 1;
mem
![](/icons/9014set.gif)
(pResult, 0, size);
![](/icons/9014if.gif)
(pipe(fd))
{
pr
![](/icons/9014int.gif)
f("pipe errorn");
![](/icons/9014return.gif)
–1;
}
![](/icons/9014if.gif)
((pid = fork
![](/icons/9014kh.gif)
)
![](/icons/9014dd.gif)
0)
{// chile process
![](/icons/9014int.gif)
fd2[2];
![](/icons/9014if.gif)
(pipe(fd2))
{
pr
![](/icons/9014int.gif)
f("pipe2 errorn");
![](/icons/9014return.gif)
–1;
}
close(1);
dup2(fd2[1],1);
close(fd[0]);
close(fd2[1]);
system(pCmd);
read(fd2[0], pResult, maxlen);
pResult[strlen(pResult)-1] = 0;
write(fd[1], pResult, strlen(pResult));
close(fd2[0]);
exit(0);
}
// parent process
close(fd[1]);
p = pResult;
left = maxlen;
while((count = read(fd[0], p, left))) {
p
![](/icons/9014jiadeng.gif)
count;
left -= count;
![](/icons/9014if.gif)
(left
![](/icons/9014dd.gif)
0)
![](/icons/9014break.gif)
;
}
close(fd[0]);
![](/icons/9014return.gif)
0;
}
![](/icons/9014main.gif)
(void)
{
char result[1025];
my_system("/sbin/
![](/icons/9014if.gif)
config", result, 1025);
pr
![](/icons/9014int.gif)
f("the result isnn%sn", result);
![](/icons/9014return.gif)
0;
}
延伸阅读
最新评论