xargs命令少为人知的细节
与xargs命令最初相识是在发现一个磁盘满了,具体是在/var/spool/clientmqueue,主要原因是系统中有用户开启了crontab,而crontab中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件。关于更详细的原理,可以参考我之前的文章:crontab命令的使用介绍及我的体会。
仅仅解决出现多文件的方法比较简单,在命令后加上“> /dev/null 2>&1”即可,表示程序员输出和运行错误都放到黑洞里面去,这样就不会产生文件了。
如果是要解决删除多文件的问题,则进入这个文件夹,执行“ls | xargs rm -f ”即可。xargs可以从管道中循环读取文件,一次一次的把信息输送给后面的“rm -f”。
请注意以上措辞:“一次一次的”,那么这个一次一次,是指“一个一个”还是“一批一批”呢?
很杯具,当时不求甚解,未能深入学习xargs,误解为“一个一个”。
最近在写一个程序时,需要处理一个文件中的行数据。平时都是使用php的fopen再fgets解决问题,但这次懒得套用这一套了,于是想使用管道把数据传送给php脚本。
而php脚本也利用$argv这个数组来获取命令行输入的参数,那么很简单的,获取$argv[1],就可以了。如“php a.php b”,$argv[0]为文件名a.php,$argv[1]就是后面的参数b了。于是想当然的:cat uid.txt | xargs php a.php 。
最终发现,uid.txt中有近4千行的数据,但是只处理了4行。那么,既然出现问题就边解决边学习吧!
使用:cat uid.txt | xargs echo > file.out
发现 file.out文件果然就是四行,但是每行都很长。。。。。
如下,uid.txt内容为:(“......”表示很多行)
以下是引用片段: 1234567890 ...... 2234567890 ...... 3234567890 ...... 4234567890 ...... |
那么file.out的结果为:
以下是引用片段: 第一行:1234567890 ...... 第二行:2234567890 ...... 第三行:3234567890 ...... 第四行:4234567890 ...... |
所以,程序处理每一行的第一个了,剩下的全部被忽略。而我期望的结果是xargs每次给我一行。
那么寻求man的帮助吧:
以下是引用片段: --max-chars=max-chars, -s max-chars --max-args=max-args, -n max-args |
首先看-s参数,它提示说每次的输出不能超过131072 bytes,从结果上看上去它每次都往最大的值释放数据。再看-n参数,提示我们可以使用这个参数指定每次从源文件中取几行数据,那么OK,搞定了!如下:cat uid.txt | xargs -n 1 php a.php。问题解决。
更进一步的:
1:其实每个系统对于参数列表的大小都有限制。比如ARG_MAX一般至少定义为4096 bytes。如果超过了ARG_MAX,将产生shell错误:Argument list too lang,这个问题可以用上面说的xargs命令解决问题。
2:xargs的-s参数,根据实战的结果,貌似会在指定的值和真实数据中取得平衡,不会只依据-s指定的大小活生生的把源数据的一行撕裂成两行。
建议继续学习:
- vim几个小技巧(批量替换,列编辑) (阅读:35992)
- ps - 按进程消耗内存多少排序 (阅读:11354)
- 100个常用的linux命令 (阅读:10226)
- 每个程序员都应该知道的8个Linux命令 (阅读:9528)
- 最受欢迎的10个 Linux 单行命令 (阅读:8898)
- Linux date 命令获取某日期的前一天 (阅读:8519)
- find命令的一点注意事项 (阅读:8301)
- ps 命令常见用法 (阅读:7951)
- Linux常用系统信息查看命令 (阅读:7426)
- Linux 常见高危操作 (阅读:7115)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:yayu 来源: 芽雨快跑
- 标签: xargs 命令 细节
- 发布时间:2010-06-03 13:34:29
- [71] IOS安全–浅谈关于IOS加固的几种方法
- [70] Twitter/微博客的学习摘要
- [65] 如何拿下简短的域名
- [64] android 开发入门
- [63] Go Reflect 性能
- [62] find命令的一点注意事项
- [60] 流程管理与用户研究
- [59] 图书馆的世界纪录
- [59] 读书笔记-壹百度:百度十年千倍的29条法则
- [58] Oracle MTS模式下 进程地址与会话信