问题:
相信大家都知道在目录中搜索含有固定字符串文件的命令:
find . -name '*.py' |xargs grep test
刚开始的时候,我不熟悉xargs命令,所以直接使用的命令是
find . -name '*.py' |grep test
结果并不是自己所期望的。此命令只是找出文件名*.txt有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和管道的作用理解清楚了。
xargs还有指定参数位置的作用。假设我们要将目录下所有的.py文件放到Python目录中去,可以使用命令
find . -name '*.py' | xargs -I {} mv {} ./Python
参数-I指定了管道前命令作为参数所应该在管道后面命令的位置。
我们在查看很多命令手册时,手册会说明命令的使用方法。例如
grep [OPTIONS] PATTERN [FILE...],也就是命令的最后一个位置是文件名[FILE]。
这里要注意这个文件名[FILE]也是参数。
海量it视频获取
- 大小: 39.9 KB
分享到:
相关推荐
在Linux系统中,`find`、`xargs`和`grep`是三个非常强大的命令行工具,它们分别用于查找文件、处理输出结果和搜索文本。本文将深入探讨这些工具的联合使用方法,特别是如何利用`-print0`和`-o`选项以及管道(`|`)来...
### Linux 下xargs命令详解及xargs与管道的区别 ...相比于简单的管道操作,`xargs`提供了更多的灵活性和控制能力,尤其适用于需要批量处理大量数据的情况。掌握好`xargs`的用法,对于提高工作效率大有裨益。
在Linux系统中,`find` 和 `xargs` 是两个非常重要的命令行工具,它们被广泛用于文件搜索、处理等任务中。本文将详细解析这两个命令的功能、用法及其应用场景。 #### 1. find 命令 `find` 命令是Linux系统中最强大...
本篇文章将深入探讨如何使用`grep`命令来检索文件内容,并简要介绍`grep`与`find`命令之间的区别。 #### 一、grep命令基础用法 `grep`命令的基本格式为: ``` grep [选项] "模式" 文件名 ``` 其中,“模式”是指要...
通过与`find`、`grep`等命令组合使用,可以实现强大的文件管理和数据处理功能。 总结来说,`xargs`是Linux命令行中的一个强大工具,能够帮助用户更高效地处理大量数据,提高自动化任务的执行效率。掌握`xargs`的...
`find`命令是Linux系统中一个非常强大的工具...理解并熟练掌握`find`命令及其选项,可以帮助我们更高效地在Linux系统中管理和查找文件,提高工作效率。在实际使用中,可以结合其他命令和工具,形成强大的文件处理流程。
- **-type b/d/c/p/l/f**:匹配不同类型的文件,包括块设备文件 (`b`)、目录 (`d`)、字符设备文件 (`c`)、管道文件 (`p`)、符号链接 (`l`) 和普通文件 (`f`)。 - **-size n[c]**:根据文件大小进行匹配,默认单位为 ...
# 使用whereis获取更多关于find和grep的信息 $ whereis find grep # 使用whence查看find和grep的来源 $ whence -pv find grep ``` ### 其他知识点 除了以上内容外,还介绍了如何使用`file`命令来确定文件的类型,...
find / -name "web.xml" -type f | xargs grep "10.71.110.89" ``` 这条命令会找到所有名为"web.xml"的文件,并检查它们是否包含"10.71.110.89"这个IP地址。 7. **执行操作** - `-exec command {} \;`:在找到...
- 在处理大量文件时,使用 `-print0` 和 `xargs -0` 可以避免 `find` 命令由于命令行过长而出错。 - 需要注意的是,`find` 命令的执行可能会很慢,特别是当搜索范围较大时。因此,在生产环境中使用时需要谨慎考虑...
### Linux 下 find 命令实例详解 #### 概述 `find` 是 Linux 和类 Unix 系统中一个非常强大的文件查找工具。通过 `find` 命令,用户可以基于多种条件来搜索...希望本文的实例能帮助您更好地理解和应用 `find` 命令。
5. **结合其他命令使用**:grep常与其他命令如管道符`|`和`xargs`结合使用,以实现更复杂的文本处理任务。例如,`find . -name "*.txt" | xargs grep "keyword"`可以在当前目录下查找所有.txt文件并搜索关键字。 6....
例如,配合`xargs`或`find`命令,可以实现更复杂的文件筛选和操作。 总之,rga是Linux开发者和系统管理员的利器,它不仅扩展了grep的功能,还提供了一种统一的方式来搜索各种类型的数据,使得在命令行界面中处理...
下面将分别介绍压缩包中的各个章节内容,以帮助读者深入理解Shell编程的关键知识点。 第1章:文件安全与权限 这一章讲解了Linux和UNIX文件系统的权限模型,包括读、写和执行权限,以及所有者、组和其他用户的权限...
xargs的主要功能是将来自stdin的数据流,通常是通过管道(|)传递的,分割成独立的参数,然后传递给指定的命令。默认情况下,它使用空格或换行符作为分隔符。但需要注意的是,如果文件名或数据中包含空格,xargs...
- `|`(管道):将一个命令的输出作为另一个命令的输入,例如`find . -type f -name "*.cc" | xargs grep 'asiainfo'`。 - `-exec`:在find命令中执行指定的命令,例如`find . -type f -exec grep "127.0.0.1" {} ...
9. **使用find和xargs** (002-使用find和xargs.PDF): find命令用于查找满足特定条件的文件和目录,而xargs命令则可以把find的结果作为参数传递给其他命令,实现批量处理。结合使用,它们可以执行如批量重命名、删除...
例如,如果要查找/etc目录下所有的.conf文件并列出其详细信息,可以使用以下命令:find /etc -name "*.conf" | xargs ls -l。 网络配置方面,Linux系统中ifconfig命令用于配置和显示系统网络接口的参数。使用...
总结起来,在Unix环境中搜索含有关键字的文件,主要依赖于`grep`、`find`、`ack`等命令,结合各种选项和管道操作,可以实现灵活而高效的文件搜索。熟练掌握这些工具,将极大地提升你在Unix环境中的工作效率。
5. **使用find和xargs**(002使用find和xargs.PDF):`find`命令用于查找满足特定条件的文件,而`xargs`则可以将`find`的结果传递给其他命令,实现高效的数据处理。结合使用这两个工具,可以执行强大的文件查找和...