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 關鍵字的用法)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM