Linux - Shell - 在多个文件中查找关键字

1. 概述

  1. 在多个文件中 查找内容

2. 想干啥

  1. 目的

    1. 在 多个文件 中, 查找内容
  2. 准备

    1. 之前在 单个文件里 查找过内容
      1. 工具
        1. awk
          1. 前提

            1. 文件有固定格式
            2. 查找时有字段的要求
          2. 例子

            # print $0 就一句话, 所以 不要 {} 也可以
            > awk '{if($0 ~ <patter>){print $0}}' <fileName>
            
        2. grep
          1. 前提

            1. 这个要求没那么多
          2. 例子

            > cat <fileName> | grep <pattern> 
            
  3. 例子

    1. 要求

      1. 查找多个文件里, 含有 1 的行
      2. 并知道是哪个文件里的
    2. 文件

      # 得到 1 2 3 三个文件, 每个文件的内容, 是 1 到 10 
      > seq 1 10 > 1
      > seq 1 10 > 2
      > seq 1 10 > 3
      # 可以用 循环写, 也不难对吧
      > for i in {1..3};do seq 1 10 > ${i};done
      

2. 思路1: cat | grep

  1. 命令

    > cat * | grep '1'
    
  2. 结果

    1. 输出

      1
      10
      1
      10
      1
      10
      
    2. 感觉不行

      1. 找到了 1
      2. 但是不知道内容分布在 哪个文件里

3. 思路2: find | xargs grep

  1. 命令

    # 不理解 find 的同学, 可以用 ls 代替
    # 我就不怎么理解
    # -name 支持 通配符, 我的目录下只有三个文件, 所以也可以不带
    > find . -type f -name "*" | xargs grep "1"
    
  2. 结果

    1. 输出

      1:1
      1:10
      2:1
      2:10
      3:1
      3:10
      
    2. 这次还行

      1. 带了文件名了, 哈哈
        1. 搞定

4. 思路

  1. 思路

    1. find

      1. find
        1. 找到 特定文件
        2. 将 文件名, 传递给 grep
      2. grep
        1. 获取多个 文件名
        2. 挨个文件查找内容
        3. 找到的话, 就显示出来
    2. cat

      1. cat
        1. 将所有文件的内容, 放入流
        2. 将流传给 grep
      2. grep
        1. 收到一个流
          1. 文件名已经丢失了
        2. 查找内容
          1. 所以只能找到内容
  2. 区别

    1. grep 可以接受不同的东西

      1. 参数
        1. 收到参数后, 去找文件
        1. 收到流后, 直接在流里面找
        2. 所以文件名丢了
    2. 疑问1: 为啥跟了 xargs 的 grep 就自带行号, 而 跟了 cat 的就没有?

      1. grep 后面跟了多个文件名, 就会自己带
        1. 单个文件 或者 流 的时候就不带

ps

  1. ref
    1. Linux上批量查找文件里面带的关键字(grep 关键字的用法)
posted @ 2019-10-24 22:13  轩辕拾銉  阅读(25121)  评论(0编辑  收藏  举报