免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1671 | 回复: 9
打印 上一主题 下一主题

[文本处理] 嵌入式shell scripts [复制链接]

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-10 22:02 |只看该作者 |倒序浏览
本帖最后由 linuxfellow 于 2013-01-11 11:23 编辑

想在C代码里运行一段shell scripts
const char xmlShellcmdBuf[] = "mount | awk '{print $3}'|sed 's;$;/xyz/xyz.xml;g'|sed 's;//;/;g'|awk '{if(test -f $1){ print $1}}'";
作用是,先用mount命令找到所有文件系统挂载点;从挂载点开始在固定目录下找指定文件” xyz/xyz.xml, 上面是代码.
前面的部分能正常工作:
mount | awk '{print $3}'|sed 's;$;/xyz/xyz.xml;g'|sed 's;//;/;g'
能构造出想要查找的文件的文件名: ${mount_point}/xyz/xyz.xmk

最后一部分有问题:
awk '{if(test -f $1){ print $1}}'
这一段的本意是要检查前面构造出的文件名对应的文件是否真实存在, 如存在,才打印该文件名。  但“test -f $1” 总是返回真,把不存在的文件也打印出来了。

试了if [ -f $1 ] .....,  但C code编译通不过;引号里再带引号,C code也不能编译, 如"test -f "$1""C code就不能编译。

不知test -f $1问题出在什么地方?
谢谢!

论坛徽章:
0
2 [报告]
发表于 2013-01-10 22:15 |只看该作者
这样写代码没错啊,怎么会不行呢?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
3 [报告]
发表于 2013-01-10 22:42 |只看该作者
回复 1# linuxfellow


    awk没有 test -f 这样的语法啊。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
4 [报告]
发表于 2013-01-11 11:13 |只看该作者
回复 2# 软行世界

awk '{if(test -f $1){ print $1}}'
问题在于,打印了所有的文件名,包括那些不存在的文件的文件名。
   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
5 [报告]
发表于 2013-01-11 11:21 |只看该作者
awk '{if(test -f $1){ print $1}}' 这一段要求很明确:根据给定文件名确定这一文件是否存在,如存在该文件就打印。 逻辑应该是这样:
[ -f $1]   &&  print $1
但如何把上面的代码嵌到pipe里去呢?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
6 [报告]
发表于 2013-01-11 11:33 |只看该作者
看看执行结果。
1。  检查挂载点
$ mount | awk '{print $3}'
/
/proc
/sys
/sys/fs/fuse/connections
/sys/kernel/debug
/sys/kernel/security
/dev
/dev/pts
/run
/run/lock
/run/shm
/proc/sys/fs/binfmt_misc
/var/lib/nfs/rpc_pipefs
/proc/fs/nfsd
/run/vmblock-fuse
/home/zhangz/.gvfs

2。构造要寻找的文件的文件名:
$ mount | awk '{print $3}'|sed 's;$;/xyz/xyz.xml;g'|sed 's;//;/;g'
/xyz/xyz.xml
/proc/xyz/xyz.xml
/sys/xyz/xyz.xml
/sys/fs/fuse/connections/xyz/xyz.xml
/sys/kernel/debug/xyz/xyz.xml
/sys/kernel/security/xyz/xyz.xml
/dev/xyz/xyz.xml
/dev/pts/xyz/xyz.xml
/run/xyz/xyz.xml
/run/lock/xyz/xyz.xml
/run/shm/xyz/xyz.xml
/proc/sys/fs/binfmt_misc/xyz/xyz.xml
/var/lib/nfs/rpc_pipefs/xyz/xyz.xml
/proc/fs/nfsd/xyz/xyz.xml
/run/vmblock-fuse/xyz/xyz.xml
/home/zhangz/.gvfs/xyz/xyz.xml

3。检查文件,如文件存在,就打印文件名
$ mount | awk '{print $3}'|sed 's;$;/xyz/xyz.xml;g'|sed 's;//;/;g'|awk '{if(test -f $1){ print $1}}'
/xyz/xyz.xml
/proc/xyz/xyz.xml
/sys/xyz/xyz.xml
/sys/fs/fuse/connections/xyz/xyz.xml
/sys/kernel/debug/xyz/xyz.xml
/sys/kernel/security/xyz/xyz.xml
/dev/xyz/xyz.xml
/dev/pts/xyz/xyz.xml
/run/xyz/xyz.xml
/run/lock/xyz/xyz.xml
/run/shm/xyz/xyz.xml
/proc/sys/fs/binfmt_misc/xyz/xyz.xml
/var/lib/nfs/rpc_pipefs/xyz/xyz.xml
/proc/fs/nfsd/xyz/xyz.xml
/run/vmblock-fuse/xyz/xyz.xml
/home/zhangz/.gvfs/xyz/xyz.xml

现在系统里任何目录下都没有xyz.xml, 应该不打印任何东西,但结果打印了所有文件名

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
7 [报告]
发表于 2013-01-13 23:26 |只看该作者
顶上。。。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2013-01-14 00:10 |只看该作者
帮顶……。。。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
9 [报告]
发表于 2013-01-14 10:57 |只看该作者
回复 6# linuxfellow
  1. mount | awk '{print $3}' | sed 's;$;/xyz/xyz.xml;g' | sed 's;//;/;g' | awk '{if(!system("[ -f "$1" ]")){ print $1}}'
复制代码

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
10 [报告]
发表于 2013-01-15 10:15 |只看该作者
回复 9# Shell_HAT
感谢楼上的回复。 如果要把上面的scripts嵌到C代码里:

const char shScripts[] = "mount | awk '{print $3}' | sed 's;$;/xyz/xyz.xml;g' | sed 's;//;/;g' | awk '{if(!system("[ -f "$1" ]")){ print $1}}'";

C 字符串,引号带多重引号,我没有编译通过,或是编译通过了, 运行结果不对;这一方法还没走通。明天用你这段脚本再试试。

我编了一段不带引号的脚本, 可以正确在C 代码里运行,解决了问题:
echo $(mount | awk '{print $3}'|sed 's;$;/hmpl/hmpl.xml;g'|sed 's;//;/;g') | { read var; for i in ${var}; do [ -e $i ] && echo $i; done ;}

再次感谢楼上的回复!

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP