如何筛选出在四个指定输入文件中均存在的行?
找出所有四个文件中共同存在的行
要提取在file1、file2、file3、file4这四个文件里都出现过的行,你可以基于已经尝试的命令做进一步过滤,具体方案如下:
方法一:基于统计计数过滤(最简洁高效)
你已经通过cat file* | sort | uniq -c得到了每行的出现次数——因为我们有4个输入文件,且每个文件内的行没有重复(从你的示例内容可确认),所以出现次数等于4的行,就是在所有文件中都存在的行。
直接执行完整命令:
cat file* | sort | uniq -c | awk '$1 == 4 {print $2}'
命令拆解:
cat file*:合并所有以file开头的文件内容sort:对合并后的内容排序,让相同的行集中在一起uniq -c:统计每行出现的次数,输出格式为「次数 行内容」awk '$1 == 4 {print $2}':筛选出次数为4的行,只输出对应的行内容
执行后会得到你预期的结果:
/dev/dev_sg2 /dev/dev_sg3
方法二:用grep逐文件匹配(适合文件数量少的场景)
如果你不想依赖统计计数,也可以用grep逐层筛选交集:
grep -xFf file1 file2 | grep -xFf - file3 | grep -xFf - file4
命令拆解:
-x:强制匹配整行,避免部分内容匹配的误判-F:把搜索内容当作固定字符串(而非正则表达式)-f:从指定文件读取需要匹配的模式- 管道依次筛选:先找出
file1和file2的共同行,再和file3找交集,最后和file4找交集
这个方法也能得到相同结果,但当文件数量增多时,写法会比较繁琐,不如第一种方法简洁。
内容的提问来源于stack exchange,提问作者asokan
相关产品推荐
相关产品推荐

