`
huangjinjin520
  • 浏览: 71413 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

对find xargs grep和管道的深入理解

阅读更多
问题:
相信大家都知道在目录中搜索含有固定字符串文件的命令:

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
0
0
分享到:
评论

相关推荐

    find -o -print0 通道 xargs grep 的联合用法

    在Linux系统中,`find`、`xargs`和`grep`是三个非常强大的命令行工具,它们分别用于查找文件、处理输出结果和搜索文本。本文将深入探讨这些工具的联合使用方法,特别是如何利用`-print0`和`-o`选项以及管道(`|`)来...

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

    ### Linux 下xargs命令详解及xargs与管道的区别 ...相比于简单的管道操作,`xargs`提供了更多的灵活性和控制能力,尤其适用于需要批量处理大量数据的情况。掌握好`xargs`的用法,对于提高工作效率大有裨益。

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

    在Linux系统中,`find` 和 `xargs` 是两个非常重要的命令行工具,它们被广泛用于文件搜索、处理等任务中。本文将详细解析这两个命令的功能、用法及其应用场景。 #### 1. find 命令 `find` 命令是Linux系统中最强大...

    Linux中利用grep命令如何检索文件内容详解

    本篇文章将深入探讨如何使用`grep`命令来检索文件内容,并简要介绍`grep`与`find`命令之间的区别。 #### 一、grep命令基础用法 `grep`命令的基本格式为: ``` grep [选项] "模式" 文件名 ``` 其中,“模式”是指要...

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

    通过与`find`、`grep`等命令组合使用,可以实现强大的文件管理和数据处理功能。 总结来说,`xargs`是Linux命令行中的一个强大工具,能够帮助用户更高效地处理大量数据,提高自动化任务的执行效率。掌握`xargs`的...

    linux - find 命令总结

    `find`命令是Linux系统中一个非常强大的工具...理解并熟练掌握`find`命令及其选项,可以帮助我们更高效地在Linux系统中管理和查找文件,提高工作效率。在实际使用中,可以结合其他命令和工具,形成强大的文件处理流程。

    find的用法很有用

    - **-type b/d/c/p/l/f**:匹配不同类型的文件,包括块设备文件 (`b`)、目录 (`d`)、字符设备文件 (`c`)、管道文件 (`p`)、符号链接 (`l`) 和普通文件 (`f`)。 - **-size n[c]**:根据文件大小进行匹配,默认单位为 ...

    AIX 手册1-18 14 英文

    # 使用whereis获取更多关于find和grep的信息 $ whereis find grep # 使用whence查看find和grep的来源 $ whence -pv find grep ``` ### 其他知识点 除了以上内容外,还介绍了如何使用`file`命令来确定文件的类型,...

    unix find命令

    find / -name "web.xml" -type f | xargs grep "10.71.110.89" ``` 这条命令会找到所有名为"web.xml"的文件,并检查它们是否包含"10.71.110.89"这个IP地址。 7. **执行操作** - `-exec command {} \;`:在找到...

    linux find 命令大全

    - 在处理大量文件时,使用 `-print0` 和 `xargs -0` 可以避免 `find` 命令由于命令行过长而出错。 - 需要注意的是,`find` 命令的执行可能会很慢,特别是当搜索范围较大时。因此,在生产环境中使用时需要谨慎考虑...

    linux下find命令实例

    ### Linux 下 find 命令实例详解 #### 概述 `find` 是 Linux 和类 Unix 系统中一个非常强大的文件查找工具。通过 `find` 命令,用户可以基于多种条件来搜索...希望本文的实例能帮助您更好地理解和应用 `find` 命令。

    day10-文本处理.pdf

    5. **结合其他命令使用**:grep常与其他命令如管道符`|`和`xargs`结合使用,以实现更复杂的文本处理任务。例如,`find . -name "*.txt" | xargs grep "keyword"`可以在当前目录下查找所有.txt文件并搜索关键字。 6....

    linux-rga可对pdfdocxsqlitejpg电影字幕等进行内容搜索的强大命令行grep工具

    例如,配合`xargs`或`find`命令,可以实现更复杂的文件筛选和操作。 总之,rga是Linux开发者和系统管理员的利器,它不仅扩展了grep的功能,还提供了一种统一的方式来搜索各种类型的数据,使得在命令行界面中处理...

    绝对经典的《Linux与UNIX Shell编程指南》_1

    下面将分别介绍压缩包中的各个章节内容,以帮助读者深入理解Shell编程的关键知识点。 第1章:文件安全与权限 这一章讲解了Linux和UNIX文件系统的权限模型,包括读、写和执行权限,以及所有者、组和其他用户的权限...

    Linux xargs命令的使用

    xargs的主要功能是将来自stdin的数据流,通常是通过管道(|)传递的,分割成独立的参数,然后传递给指定的命令。默认情况下,它使用空格或换行符作为分隔符。但需要注意的是,如果文件名或数据中包含空格,xargs...

    三剑客及相关命令笔试题集1

    - `|`(管道):将一个命令的输出作为另一个命令的输入,例如`find . -type f -name "*.cc" | xargs grep 'asiainfo'`。 - `-exec`:在find命令中执行指定的命令,例如`find . -type f -exec grep "127.0.0.1" {} ...

    LINUX与UNIX SHELL编程指南(1-15)

    9. **使用find和xargs** (002-使用find和xargs.PDF): find命令用于查找满足特定条件的文件和目录,而xargs命令则可以把find的结果作为参数传递给其他命令,实现批量处理。结合使用,它们可以执行如批量重命名、删除...

    Week05_Unit4_管道命令和网络配置.pdf

    例如,如果要查找/etc目录下所有的.conf文件并列出其详细信息,可以使用以下命令:find /etc -name "*.conf" | xargs ls -l。 网络配置方面,Linux系统中ifconfig命令用于配置和显示系统网络接口的参数。使用...

    在Unix上搜索含有关键字的文件

    总结起来,在Unix环境中搜索含有关键字的文件,主要依赖于`grep`、`find`、`ack`等命令,结合各种选项和管道操作,可以实现灵活而高效的文件搜索。熟练掌握这些工具,将极大地提升你在Unix环境中的工作效率。

    linux与unix shell编程指南

    5. **使用find和xargs**(002使用find和xargs.PDF):`find`命令用于查找满足特定条件的文件,而`xargs`则可以将`find`的结果传递给其他命令,实现高效的数据处理。结合使用这两个工具,可以执行强大的文件查找和...

Global site tag (gtag.js) - Google Analytics