Linux-find、grep、sed


  1. grep命令与正则表达式

概念:正则表达式是一种匹配字符串的规则,通过字符和运算符进行构建,并通过元字符进行扩充,大部分元字符在使用时,需要使用转义符进行转义

基本规则

正则表达式描述
^起始行标记,比如^a,匹配以a开头的字符串
末尾行标记,比如a¥,匹配以a结束的字符串
.匹配任意一个字符,匹配空字符,不匹配换行符
|匹配|两边的任意一项,必须使用转义符
[^ ]匹配除括号内字符以外的字符
?匹配之前的项零次或一次,比如coo?l匹配col或cool,必须使用转义符
+匹配之前的项一次或多次,比如coo+l匹配cool,必须使用转义符
*匹配之前的项零次或多次,比如coo*l匹配col或cool、coool等等
( )创建一个用于匹配的字符串,比如ma(tr)?x匹配max或matrx,必须使用转义符
[ ]匹配包含在括号内的任意一个字符,*以及.在括号内均无特殊含义,[[:alnum:]]匹配字母或数字
[-]匹配指定范围内的一个字符
{n}匹配之前的项n次,比如 [0-9]{3},相当于[0-9][0-9][0-9],匹配一个三位数,必须使用转义符
{n,}匹配之前的项至少n次
{n,m}匹配之前的项至少n次至多m次
\转义字符,将上边的字符转为普通字符

常用例子

^[A-Za-z]+$  匹配任意一个单词

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}匹配任意一个ip地址,但不管地址是否合法

[0-9]{4}-[0-9]{2}-[0-9]{2} 匹配日期

.匹配任意内容 ^.匹配以任意内容开头数据 ^¥匹配空白行

([])创建一个用于匹配的字符串,[]可以使匹配的字符串为多种

grep命令

作用:在文件中匹配符合条件的字符串,然后找出匹配的行,可以作为管道中的过滤器。可以使用正则表达式进行匹配,为包含匹配,只要该行含有被匹配内容,则返回该行。

格式:grep [选项][字符串] [文件名][文件名]………

选项
-n在返回的结果行之前显示匹配行的行号

-c显示有多少行匹配

-l只显示包含匹配行的文件列表

-v 仅显示不匹配的行

-r 在当前目录下的所有文件中进行匹配
使用egrep指定使用扩展的正则表达式语法,可以在使用| ? + () {}这些字符时不使用转义符,照样可以起到正则表达式的作用。常使用egrep,因为在匹配时不需要使用转义符,除非需要将特殊符号转为普通符号

eg


    grep "p" text1 查找文件中含有p的行 
    grep "pl\?e" text1
    grep "[3p]" text1查找含有p或3的行
    grep "[[:digit:]nz][^nr]*$" text1
    grep "b\(an\)\+a" text1等价于  egrep "b(an)+a" text1
    grep -n "banana" text[1-4] 在文件text1、text2、text3、text4中查找
    grep -rn  --exclude-dir=templates "insert" * 在当前目录下查找但不在templates目录下查找
    egrep "BuildMappers" * 在当前目录中查找含有"BuildMappers"的文件
    egrep -r "BuildMappers" * 在当前目录及其子目录下的查找含有"BuildMappers"的文件
    egrep -r -l "BuildMappers" * 在当前目录及其子目录下的查找含有"BuildMappers"的文件,仅显示文件名
    egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" text  
    注意:使用转义符将.转义成普通字符!!
  1. sed命令

作用:对数据进行删除、替换、新增、选取

格式:sed [选项] ‘[动作]’ [文件名] 动作中可以使用正则表达式进行匹配

选项

-n:只把经过sed命令处理过的数据输出到屏幕上,默认输出文件中所有数据

-e:允许对输入数据使用多条sed命令编辑

-i:使用sed修改的结果修改读取的文件,而不是由屏幕输出,与动作d一起使用时,无法正确删除指定行(?)

动作

s:字符串替换,用一个字符串替换另一个字符串

c:行替换,将当前行数据替换

d:删除,删除指定行

p:打印,输出指定行,必须与-n选项一起使用

a:追加,在当前行后添加一行或多行

i:插入,在当前行前插入一行或多行

字符串替换格式

sed ‘s/旧字符串/新字符串/’ 将文件中每行第一个符合条件的字符串替换

sed ‘ns/旧字符串/新字符串/’ 将文件中第n行第一个符合条件的字符串替换

sed ‘s/旧字符串/新字符串/g’ 将文件中每行所有符合条件的字符串替换

sed ‘ns/旧字符串/新字符串/g’ 将文件中第n行所有符合条件的字符串替换

注意:使用的是三个/
eg

●根据行号对指定行进行操作

sed -n ‘2p’ test.txt 打印第二行

sed ‘2,4d’ test.txt 删除第二行到第四行

sed ‘2,¥d’ test.txt 删除第二行到最后一行,¥代表最后一行

sed -n ‘2a,newline’ test.txt在第二行后添加一行,但不修改原文件

sed -i ‘2a,newline’ test.txt在第二行后添加一行,并修改原文件

●根据数据对指定行进行操作

sed ‘s/old/new/g ’ test.txt 将文件中所有字符串old替换为new,但改变原文件

sed -i ‘s/old/new/g ’ test.txt 将文件中所有字符串old替换为new,并改变原文件

sed -i -e ‘s/old/new/g ; s/boy/girl/g’ test.txt 执行多条sed命令,并改变原文件

sed -n ‘/new/p’ test.txt 打印含有new字符串的行

sed ‘/new/d’ test.txt 删除含有new字符串的指定行,不修改原文件

sed -i ‘/new/d’ test.txt 删除含有new字符串的指定行,修改原文件

sed -n ‘/new/{s/new2/new/g; p}’ test.txt 查找含有new字符串的行,然后执行{}中的命令,执行字符串替换并打印

sed -i ‘/new/{s/new2/new/g}‘ 查找含有new字符串的行,执行字符串替换,

sed ‘s/\.$/!/g’ test.txt 将文件中以.结尾的行中的点号替换为叹号

ifconfig eth0 | grep “inet addr” | sed ‘s/^.*addr://g’ 找出含有ip地址的一行,并删除inet addr:等ip地址之前的数据

ifconfig eth0 | grep “inet addr” | sed ‘s/^.*addr://g’ | sed ‘s/Bcast. *$//g’ 删除ip地址之前和之后的数据,仅剩下ip地址

●sed脚本可以存储在文件中

eg

echo -e “s/ /\t/g”>sedtab

sed -f sedtab test.txt 执行脚本,将空格替换为制表符

  1. 文件搜索命令与通配符

●各个通配符含义:

*代表任意内容

?代表匹配任意一个字符

[]匹配括号中任意一个字符

[-]匹配括号中的任意一个字符,-代表范围

[ ^]匹配不是括号中的一个字符

●find命令

格式:find [搜索范围] [搜索条件] [- exec command { } \; ]

注意:{}与\;之间有空格,但\与;之间没有空格!

作用:在系统中搜索符合条件的文件名,支持按名子、所有者、所属组、文件类型、修改时间、大小等条件进行搜索,此外,可以使用通配符进行完全匹配
eg

find / -name “hello.cpp” 搜索名为hello.cpp的文件

find / -name “hello.cpp*” 使用通配符搜索

find / -name “*”列出当前目录下所有文件

find / -iname “hello.cpp” 不区分大小写,搜索文件名为hello.cpp的文件

find / -user root 查找属于root用户的文件

find / -group group1 查找属于group1用户组的文件

find / -nouser搜索没有所有者的文件,没有所有者的文件通常为垃圾文件,通常!

find / -nogroup搜索没有所属组的文件

find / -type b 查找块设备,还可以查找其他类型文件

find / ! -type b 查找块设备以外的文件

find / -mtime +10查找十天前修改的文件,-10代表十天以内,10代表十天当天

find / -atime +10查找十天前访问过的文件

find / -ctime +10查找十天前被修改过文件属性的文件

find . -size 10k 查找当前目录下大小为10k的文件

find . -size +10k -a -size -40k查找大于10k小于40k的文件(-o是逻辑或)

find . -inum 24675 查找当前目录下i节点为24675的文件

find . -size +1G -exec rm {} \; 查找大小为1G的文件,并且删除
find . -name “*.c” -exec mv {} ./m1/ \; 查找以.c结尾的文件并移动到m1目录
find . -name “*.c” -exec mv -t ./m1/ {} \;查找以.c结尾的文件并移动到m1目录

参考
linux sed命令详解
Why does find -exec mv {} ./target/ + not work ? (on cygwin)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值