linux中grep与find的区别,Linux三剑客【grep、sed和awk】

在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区的。
区别:
(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
(2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。

grep

# grep [-acinv] [--color=auto]  '查找字符串'  filename

参数:

-a : 将binary文件以text文件的方式查找数据

-c : 计算找到'查找字符串'的次数

-i : 忽略大小写的不同

-n: 顺便输出行号

-v: 反向选择,即显示没有 '查找字符串' 内容的那一行

--color=auto : 可以将找到的关键字部分加上颜色显示;

-A : 后面可跟数字,为after的意思,除了列出改行之外,后续的n行也列出来;

-B: 后面可加数字,为befor的意思,除了列出该行外,前面的n行也列出来;

eg: 

 

 

# grep -n 'oo'  data.txt

# grep -n '[^a-z]oo'  data.txt

# grep -n '[0-9]' a.txt

# grep -n '[[:digit:]]' b.txt // 数字

# grep -n '^the' a.txt

# grep -n 'g..d' a.txt  // .小数点表示一定有一个任意字符

# grep -n  'oo*' a.txt // * 星号表示重复前一个0到无穷多次的意思,

# grep -n 'o\{2\}' a.txt // 找到2个o字符串

# grep -n 'go\{2,5\}g'  a.txt // 找出g后面接2到5个o

也可以配合扩展正则表达式使用

+ : 重复一个或一个以上的RE字符

eg: # egrep -n 'go+d' a.txt // o+表示一个以上的o,查找god,good,goood等的字符

? :  零个或一个的前一个RE字符

eg: # egrep -n 'go?d' a.txt // 查找god或gd这两个字符

| : 用或or的方式找出前一个RE字符

eg : # egrep -n 'php|java|go' a.txt  // 查找pjp,java,go这三个字符串

() : 找出 组 字符串

eg : # egrep -n 'g(la|oo)d' a.txt  // 查找glad, good

()+ : 多个重复组的判别

eg: # egrep -n  'A(bcd)+E' a.txt  //  查找开头为A结尾E,中间有一个以上的bcd字符串的意思

 

sed工具

sed本身也是一个管道命令,可以分析standard input的,而且可以将数据进行替换,删除,新增,选取特定行等的功能。

# sed [-nefr] [动作]

参数:

-n : 使用安静模式,在一般sed的用法中,所有来自STDIN的数据一般都会列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来。

-e: 直接在命令行模式上进行sed的动作编辑

-f : 直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作

-r : sed的动作支持的是扩展型正则表达式的语法,(默认是基础正则表达式语法)

-i: 直接修改读取的文件内容,而不是由屏幕输出

动作说明:

[n1[,n2]] function

n1,n2:不见得存在,一般代表选择进行动作的行数,

function参数:

a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前下一行)

c: 替换,c后面可以接字符串,替换n1,n2之间的行

d: 删除, d后面不接任何参数

i:插入, i的后面可以接字符串,这些字符串会在新的一行出现,(目前上一行)

p: 打印,也就是将某个选择数据打印出来,

s:替换, 可以直接进行替换的工作,通常这个s的动作可以搭配正则表达式,例如:1,20s/old/new/g

eg:

 

 

#  nl data3.txt | sed '5,7d'  // 删除5.7行

# nl data3.txt | sed '3.$d' // 删除第3行到最后一行

#   nl data3.txt  | sed '2,5a hello world!'   // 增加单行

 

增加多行:增加多行每一行之间必须以反斜杠"\"来进行新的增加。

# nl data3.txt |sed '5a hello world...\
> hello PHP 8...!!! \
> hello Golang ~~~ '

 

将2-5行替换成“”“hello java 2023!”

# nl data3.txt |sed '2,5c hello java 2023! '

 

# nl data3.txt   | sed -n '2,6p'

 

sed 's/要替换的字符串/新的字符串/g'

# nl data3.txt | sed 's/2023/2011/'

 

 

 

 sed直接修改文件内容

在最后一行添加内容, hello beijing 2023

# sed -i '$a hello beijing 2023' data3.txt

 

 

#  sed -i 's/\!$/\./g' data3.txt   // 将行结尾!的替换为.

 

posted on 2023-09-20 20:35  建安永乐  阅读(142)  评论(0编辑  收藏  举报

导航