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 // 将行结尾!的替换为.