`
iwebcode
  • 浏览: 1997050 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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,-smax-chars
Useatmostmax-charscharacterspercommandline,includingthecommandandinitial-argumentsandthe
terminatingnullsattheendsoftheargumentstrings.Thedefaultis131072characters,notincluding
thesizeoftheenvironmentvariables(whichareprovidedforseparatelysothatitdoesn’tmatterif
yourenvironmentvariablestakeupmorethan131072bytes).Theoperatingsystemplaceslimitsonthe
valuesthatyoucanusefullyspecify,andifyouexceedtheseawarningmessageisprintedandthe
valueactuallyusedissettotheappropriateupperorlowerlimit.

--max-args=max-args,-nmax-args
Useatmostmax-argsargumentspercommandline.Fewerthanmax-argsargumentswillbeusedifthe
size(seethe-soption)isexceeded,unlessthe-xoptionisgiven,inwhichcasexargswillexit.

首先看-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指定的大小活生生的把源数据的一行撕裂成两行。

转自:http://blogread.cn/it/article/1727?f=sa

分享到:
评论

相关推荐

    find命令和xargs命令配合使用

    find命令和xargs命令配合使用,自己总结的,觉得还好

    Linux xargs 命令用法详解

    Linux xargs 命令 xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。 xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。 xargs 也可以将单行或多行文本...

    Linux中xargs命令的使用方式.doc

    xargs 是给命令传递参数的一个过滤器,可以将管道或标准输入的数据转换成参数,默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行,不过通过 xargs 的处理,换行将被空格取代。

    windows dos下xargs使用

    windows dos下xargs使用

    Linux 下xargs命令详解及xargs与管道的区别

    在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别,本文通过实例给大家详解,需要的的...

    Linux xargs命令详细介绍

    Linux xargs命令 1.功能: xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令。因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时候,...

    linux中xargs命令的各种使用技巧

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。下面这篇文章主要给大家介绍了关于linux中xargs命令用法的相关资料,需要的朋友可以参考借鉴,下面来跟着小编一起看看吧。

    linux shell脚本学习xargs命令使用详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中...

    xargs命令 过滤器

    xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者 stdin 并将其转换成特定命令的命令参数。 xargs也可以将单行或多行文本...

    Linux基础之xargs命令的入门实例

    xargs命令有两个要点。第一,你必须列出目标文件。第二,你必须指定对每个文件需要执行的命令或脚本。 xargs命令被用来处理分布在不同目录下的文件: 计算所有文件的行数 打印指定文件的第一行 对每个文件执行一...

    Linux文件查找命令find,xargs详述

    文章主要对Linux文件查找命令find和xargs进行详细描述,感性趣的朋友可以参考下。

    Linux xargs命令的使用

    主要介绍了Linux xargs命令的使用,帮助大家更好的掌握Linux系统的使用,感兴趣的朋友可以了解下

    在Linux上使用xargs命令的详细教程

    xargs 可以将一个命令的输出作为参数发送给另一个命令。 在 Linux 中,所有标准的应用程序都有与之关联的三个数据流。分别是标准输入流(stdin),标准输出流(stdout)和标准错误流(stderr)。这些流通过文本来...

    可在windows使用的类linux工具xargs

    可在windows使用的类linux工具xargs,可以配合类liunx工具find进行文件处理。xargs的使用帮助为 xargs --help,实例可以上网查询。也可另外下载我的dos工具。

    linux find命令之xargs简单概述

    find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。 在有些系统中,使用-exec选项会...

    Linux_的命令find_xargs详述(2).txt

    Linux_的命令find_xargs详述(1)

Global site tag (gtag.js) - Google Analytics