Linux - Shell - 在多个文件中查找关键字
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 后面跟了多个文件名, 就会自己带
-
ps
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出