代码改变世界

linux中grep的用法 查找两个文件的相同之处,不同之处

2013-07-09 22:47  youxin  阅读(1565)  评论(0编辑  收藏  举报

 http://www.9usb.net/200902/linux-grep.html

http://blog.51yip.com/linux/1008.html

http://blog.csdn.net/svod/article/details/5786656(内容如下)

找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件,然后把他们重新生成一下。要求只能用一行命令。

我对Linux 是个白痴,工作了之后才开始接触的,会用的命令只有那几个常用的。这个问题对我来说就有点难度,我只是大概知道查找文件用 grep ,其他的就不知道了。不过没关系,用Google ,查找到 grep 的完整用法:

1、grep -l ‘boss’ * 显示所有包含boss的文件名。
2、grep -n ‘boss’ file在匹配行之前加行号。
3、grep -i ‘boss’ file显示匹配行,boss不区分大小写。
4、grep -v ‘boss’ file显示所有不匹配行。
5、grep -q ‘boss’ file找到匹配行,但不显示,但可以检查grep的退出状态。(0为匹配成功)
6、grep -c ‘boss’ file只显示匹配行数(包括0)。
7、grep “$boss” file扩展变量boss的值再执行命令。
8、ps -ef|grep “^*user1″ 搜索user1的命令,即使它前面有零个或多个空格。
9、ps -e|grep -E ‘grant_server|commsvr|tcpsvr|dainfo’ 查找多个字符串的匹配(grep -E相当于egrep)


了解了grep的参数之后,问题就解决了一半了,因为可以搜索出符合条件的文件了。不过光有grep 还是不行,因为要把搜索出来的文件名作为参数传给 generate 命令。OK,接下来该管道符出场了。

即使是像我这样对Linux只是有一点了解的人也经常用到管道符,比如“|”,示例: ls -a | more 。但是对于管道符的具体意义和它做了什么我就不知道了,没关系,Google 一下,找到一些资料:

利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

所以查找的时候可以这样写:

grep -rl “aaa” * | grep -v “bbb”

这样右边的命令就可以从前面的结果中筛选了。然后还有 generate 命令,因为生成文件的命令格式是这样的:

generate 文件名

不过如果直接使用 generate grep -rl “aaa” * | grep -v “bbb” 的话会出错,因为命令会从左向右执行,这条命令就会把grep作为一个文件名来看待。怎么办呢?这个时候就要使用 · (键盘上数字键1 旁边的那个符号,和“~”在一个按键上)来做命令替换了,用 · 把后面的 grep 命令包起来就好了,这样:

generate ·grep -rl “aaa” * | grep -v “bbb”·

然后就搞定了。

http://www.linuxidc.com/Linux/2011-04/34694.htm

 

grep 正则匹配文件

grep -in  被查找的字符串 *.log  

注意: 正则匹配前后不能有 双引号出现。否则匹配不到。

这样会列出文件夹。

find . -name    "被查找的字符串" *.log   | xargs cat  |grep ERROR 
 
这种要好,用cat 后grep没有显示出查找的内容在哪个文件。
 

混合使用

有时候我们会查询正在改变的文件,但是我们只想查看其中的某一些信息,这时候就可以使用tail、grep的混合使用

tail -f filename | grep 'DEBUG'

实例

tail -f tmd.log | grep 'DEBUG.template.begin'

 
 

假设当前目录下有多个zip文件
data.zip invoices.zip pictures.zip visit.zip,
直接
unzip *.zip
等价于
unzip data.zip invoices.zip pictures.zip
会报错

Archive: data.zip
caution: filename not matched: invoices.zip
caution: filename not matched: pictures.zip
caution: filename not matched: visit.zip
因为会认为后面三个zip文件是在第一个zip文件里面的,因此需要
unzip '*.zip'
或者
unzip "*.zip"
或者
unzip \*.zip
来屏蔽掉linux的通配符(man可以看到Be sure to quote any character that might otherwise be interpreted or modified by the operating system, particularly under Unix and VMS.)
或者
for z in *.zip; do unzip $z; done
————————————————

unzip解压到指定目录

unzip xx  -d <目录>

 

 

例如查询2020-02-19 14:10到2020-02-19 14:15区间的日志

 

 
1
grep "2020-02-19 14:1[0-5]" dubbo-elastic-job.log
 

查找两个文件的相同之处

方法一:sort

                 sort 文件1 文件2uniq -d (

  • -d或--repeated 仅显示重复出现的行列。

方法二:awk                 

               awk '{print $0}'  文件1  文件2 | sort | uniq -d

方法三:grep                只能用于两个文件中一整行内容都相同的结果的查找,速度较快

              grep -f   文件1  文件2

              grep -Ff  文件1 文件2

 

方法四:grep      一行中部分内容相同的情况处理

              grep -wf  文件1  文件2

 

 

查找两个文件的不同之处

diff   文件1  文件2

 

两个文件相减https://blog.csdn.net/crazyhacking/article/details/8637880

file1-file2:去除掉file2中的行

grep -vFf  file2  file1             //从file1中去除file2文件中的共同项

grep -vwf  file2  file1             //从file1中去除file2文件中的共同项

 

 

grep -Ff只能用于两个文件中一整行内容都相同的结果的查找,速度较快,但是遇到一行中部分内容相同的情况就处理不了,所以就有了grep -wf。

grep -Ff text1 text2 //整行相同

grep -wf text2 text1 //部分相同

grep -f 1.list 2.list //输出2.list中包含1.list中行的行

grep -vwf 1.list 2.list //在2.list中删除与1.list相同的行并输出
grep -vFf 1.list 2.list //在2.list中删除与1.list相同的行并输出

grep -Ff text1 text2   //整行相同

grep -wf text2 text1   //部分相同
grep -f 1.list 2.list        //输出2.list中包含1.list中行的行

grep -vwf 1.list 2.list       //在2.list中删除与1.list相同的行并输出
grep -vFf 1.list 2.list       //在2.list中删除与1.list相同的行并输出
  • -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-w, --word-regexp force PATTERN to match only whole words
 

(、

 

摘要:缺陷是这个只要匹配(file1字符串包含file2)就行,而不是全部相等

 

例子:file1:

1      ww
2      mm
3      df
4       df
5       sf
6       as
7       jk
8       mk
a       kl
b       lk
c       kk
d       ll
file2:
d      ll
c      kk
2      mm

结果:file1-file2:去除掉file2中的行

 

grep -vFf file2 file1

命令分析:grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

-f StringFile 指定包含字符串的文件。

-v反向

 

1、统计两个文本文件的相同行

grep -Ff file1 file2


2、统计file1中有,file2中没有的行  file1-file2

grep -vFf file2 file1

 

 

-w或--word-regexp: 只显示全字符合的列。

-v或--revert-match: 反转查找。

-f<范本文件>或--file=<范本文件>: 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。

-v, --invert-match select non-matching lines
-f, --file=FILE obtain PATTERN from FILE
-w, --word-regexp force PATTERN to match only whole words
 
 

grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作

grep -E 'pattern1|pattern2' filename

或者使用egrep  'pattern1|pattern2' filename
 
  1. 使用多个grep命令

可以使用多个 grep 命令 ,由管道符分割,以此来实现 AND 语义。

grep -E 'pattern1' filename | grep -E 'pattern2'  




  1. 使用 -E 'pattern1.*pattern2'

grep命令本身不提供AND功能。但是,使用 -E 选项可以实现AND操作。

grep -E 'pattern1.*pattern2' filename  
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename 

第一个例子如下:(其中两个pattern的顺序是指定的)

$ grep -E 'Dev.*Tech' employee.txt  
200  Jason   Developer  Technology  $5,500 

第二个例子:(两个pattern的顺序不是固定的,可以是乱序的)

$ grep -E 'Manager.*Sales|Sales.*Manager' employee.txt