-
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
注意:使用转义符将.转义成普通字符!!
- 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 执行脚本,将空格替换为制表符
- 文件搜索命令与通配符
●各个通配符含义:
*代表任意内容
?代表匹配任意一个字符
[]匹配括号中任意一个字符
[-]匹配括号中的任意一个字符,-代表范围
[ ^]匹配不是括号中的一个字符
●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)