【Linux】- 对find,xargs,grep和管道的一些理解
问题
相信大家都知道在目录中搜索含有固定字符串文件的命令:
find . -name '*.py' |xargs grep test
刚开始的时候,我不熟悉xargs命令,所以直接使用的命令是:
find . -name '*.py' |grep test
结果并不是自己所期望的。此命令只是找出文件名中包含"test"的文件。
本文旨在揭示xargs究竟做了什么,使得结果不一样。
参数与标准输入
这两个词在Linux命令中是很常见的。但是参数和标准输入其实是有区别的。我们日常使用的很多命令,例如:ls -lah .中。l、 a、 h 、.都是命令ls的参数。至于标准输入,可以说它是某种流数据。而通常来讲标准输入的流数据来源就是我们的终端输入。在Linux命令中,有些命令可以接收标准输入,有些是不能的。像上面的ls,就是只能接收参数,不能接收标准输入。像cat命令或echo命令,这些是可以的。
怎么分辨一个命令可不可以接收标准输入?很简单,当你敲完命令回车后,终端会等待接收你的输入,例如当你在终端输入cat后,终端会等待你输入字符,当你输入一些字符后,然后按Ctrl-C发送终止符号。这时cat命令接收标准输入完毕,执行命令,也就是将刚才键入的内容输出的标准输出上(屏幕)。
管道
管道的作用是将前面命令的标准输出作为后面命令的标准输入。这里要注意,后面的命令接收的是标准输入,所以如果命令不支持接收标准输入,那么就不能直接使用管道,例如常用的ls命令,只能使用参数,而不能使用标准输入,所以[command] | ls是不能使用的。而命令如echo或cat就可以。那么肯定有方法来实现这些不能使用标准输入的命令与管道结合,这时候xargs便出场了。
xargs命令
xargs命令通俗来讲就是将标准输入转成各种格式化的参数,所以命令[command 1] | xargs [command 2]就是将command 1的标准输出结果,通过管道|变成xargs的标准输入,然后xargs再将此标准输入变成参数,传给[command 2]。这样一来,通过xargs命令,我们便可以在管道后面使用那些不接收标准输入的命令了。例如[command 1]|xargs ls,是不是很熟悉?
find与grep
有了以上的知识点,到这里终于可以解答最开始的问题了。为什么命令:
find . -name '*.py' |grep test
和
find . -name '*.py' |xargs grep test
的结果是不一样的了。
我们首先来查看grep手册。通过man grep命令:
DESCRIPTION
grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN.
By default, grep prints the matching lines.
可以看到grep是支持标准输入的。
假设目录存在如下文件:
$ ls
Altitest.py python.py runora.py test.py TransferFile.py
那么对于第一个命令:find . -name '*.py' |grep test,是将前面命令的标准输出作为标准输入传给了grep test,那么grep是从这些标准输入寻找test字符,也就是文件名组成的字符流。
$ find . -name '*.py' |grep test
./Altitest.py
./test.py
可以看到最终选择出的是这些文件名。
而对于第二个命令:find . -name '*.py' |xargs grep test,通过xargs,find得到的文件名成为了参数传给后面的grep,那么这时候这些文件名就是实实在在的文件标识,grep接收后会按正常的使用方式在各文件中搜寻字符串。
#find . -name '*.py' |xargs grep test
./runora.py:testConn = cx_Oracle.connect('user/passwd@tns')
./runora.py:testCursor = testConn.cursor()
./runora.py:testCursor.execute("select * from table")
./runora.py:rows = testCursor.fetchall()
./runora.py:testCursor.close()
./runora.py:testConn.close()
到这里算是将find,grep,xargs和管道的作用理解清楚了。
转自:http://fatmouse.xyz/2016/05/10/2016-05-10-find-grep-xargs-and-pipe/
【Linux】- 对find,xargs,grep和管道的一些理解的更多相关文章
- linux学习:xargs与grep用法整理
xargs xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具. xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据. xargs 也可 ...
- linux下使用find xargs grep查找文件及文件内容
1,在某个路径下查文件. 在/etc下查找“*.log”的文件 find /etc -name “*.log” 2,扩展,列出某个路径下所有文件,包括子目录. find /etc -name “*” ...
- Linux shell -查找字符(find,xargs,grep)
在当前目录下查找含有jmxremote字符的文件 test@>find . -type f|xargs grep "jmxremote" . 当前目录 -type 查找文件类 ...
- Linux中find、grep命令详细用法
在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...
- Linux下find与grep指令的相关用法
find命令 find命令的一般形式 find命令的常用选项及实例 find与xargs grep命令 grep命令的一般形式 grep正则表达式元字符集(基本集) grep命令的常用选项及实例 1. ...
- linux下find和grep命令详解
在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...
- Linux 命令find、grep
本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 find命令的常用选项及实例 find与xar ...
- 在linux下find和grep
在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...
- 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM"
linux查看目录下所有文件内容中是否包含某个字符串 2017-07-25 15:13:22 默一鸣 阅读数 21556 文章标签: linux查找文件夹文件内容字符串 更多 分类专栏: Unix ...
随机推荐
- 用gogs搭建git服务器
Gogs 是一款极易搭建的自助 Git 服务. Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 G ...
- dtree加载慢的问题
前几天测试的时候,感觉dtree还行,也不是很慢.今天把树分支扩大以后就懵逼了,慢的一匹. 仔细看了下,才发现原来画分支的时候每次都会请求那些图,反复请求下加载时候无形拉长了很多.没有办法,就只能在h ...
- 数据结构与算法之排序(3)插入排序 ——in dart
插入排序的思想比冒泡.选择要复杂,效率也比前两者更高.插入排序算法中运用了分治.逆向冒泡等思想,假设i之前的都是排好序的,i之后的都是待比较并排序的,然后逐次逆向向前比较,若小于前值,则将前值循环依次 ...
- markupsafe._compat出错的解决办法
在windows下用pip进行安装的flask和freeze会在运行程序的时候出现报错 markupsafe._compat出错,那么此时找到对应的pip文件夹下自己创建一个_compat.py 然后 ...
- sql心经
问题: 查数据是一件很痛苦的事,尤其是多张表链接查询更是惨不忍睹 各种条件拼接,各种查询数据不对,看着写了半天的sql,感觉很完美,没毛病啊... 分析: http://blog.jobbole.co ...
- [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]
Description Solution 神仙操作orz. 首先看数据范围,显然不可能是O(n2)的.(即绝对不是枚举那么简单的),我们考虑dp. 定义f(x,k)为以x为根的子树中与x距离为k的节点 ...
- 使用salt-ssh初始化系统安装salt-minion
salt-ssh介绍及使用方法 在ssh上执行salt命令和状态而不安装salt-minion,类似于ansible. 1. salt-ssh的安装: [root@linux-node1 ~]# yu ...
- Scala中==,eq与equals的区别
根据官方API的定义: final def ==(arg0: Any): Boolean The expression x == that is equivalent to if (x eq null ...
- Maven学习(十三)-----Maven 构建生命周期
Maven 构建生命周期 构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列. 这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准 ...
- 关于Python的装饰器(1)
Python的装饰器的概念,一直有点微妙.之前在StackOverflow上看过一篇感觉说明的很清楚的介绍: *A decorator must accept a function as an arg ...