1. 概述
- 在多個文件中 查找內容
2. 想干啥
-
目的
- 在 多個文件 中, 查找內容
-
准備
- 之前在 單個文件里 查找過內容
- 工具
- awk
-
前提
- 文件有固定格式
- 查找時有字段的要求
-
例子
# print $0 就一句話, 所以 不要 {} 也可以 > awk '{if($0 ~ <patter>){print $0}}' <fileName>
-
- grep
-
前提
- 這個要求沒那么多
-
例子
> cat <fileName> | grep <pattern>
-
- awk
- 工具
- 之前在 單個文件里 查找過內容
-
例子
-
要求
- 查找多個文件里, 含有 1 的行
- 並知道是哪個文件里的
-
文件
# 得到 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
-
命令
> cat * | grep '1' -
結果
-
輸出
1 10 1 10 1 10 -
感覺不行
- 找到了 1
- 但是不知道內容分布在 哪個文件里
-
3. 思路2: find | xargs grep
-
命令
# 不理解 find 的同學, 可以用 ls 代替 # 我就不怎么理解 # -name 支持 通配符, 我的目錄下只有三個文件, 所以也可以不帶 > find . -type f -name "*" | xargs grep "1" -
結果
-
輸出
1:1 1:10 2:1 2:10 3:1 3:10 -
這次還行
- 帶了文件名了, 哈哈
- 搞定
- 帶了文件名了, 哈哈
-
4. 思路
-
思路
-
find
- find
- 找到 特定文件
- 將 文件名, 傳遞給 grep
- grep
- 獲取多個 文件名
- 挨個文件查找內容
- 找到的話, 就顯示出來
- find
-
cat
- cat
- 將所有文件的內容, 放入流
- 將流傳給 grep
- grep
- 收到一個流
- 文件名已經丟失了
- 查找內容
- 所以只能找到內容
- 收到一個流
- cat
-
-
區別
-
grep 可以接受不同的東西
- 參數
- 收到參數后, 去找文件
- 流
- 收到流后, 直接在流里面找
- 所以文件名丟了
- 參數
-
疑問1: 為啥跟了 xargs 的 grep 就自帶行號, 而 跟了 cat 的就沒有?
- grep 后面跟了多個文件名, 就會自己帶
- 單個文件 或者 流 的時候就不帶
- grep 后面跟了多個文件名, 就會自己帶
-
