sed、locate、find

sed命令:

vim的末行命令(ex模式命令):


sed:Stream EDitor,流编辑器,以行为单位对一个或多个文件进行编辑处理;每一次sed都会处理给定文件中的一行内容。


在sed处理文本时,将正在处理的当前行存储到临时的缓冲区中,称为“模式空间”;用当前行去匹配给定的PATTERN,如果能匹配,则使用command编辑处理;如果不匹配,则默认输出至标准输出;然后继续处理下一行,直到文件的末尾。


默认情况下,sed的所有处理行为不会影响源文件的内容;


我们一般会使用sed命令来自动编辑一个或多个文件,简化对文件的循环操作;


sed命令:

sed - stream editor for filtering and transforming text

sed [OPTION]... 'script' [input-file]...

常用选项:

-n, --quiet, --silent:对于不能匹配模式的行,默认不输出到屏幕;

-e script, --expression=script:多条件编辑;

-f script-file, --file=script-file:从指定的script-file中读取脚本

注意:script-file为一个能够定位到脚本文件的路径,最好为绝对路径

-i[SUFFIX], --in-place[=SUFFIX]:原文件直接编辑操作;

-r, --regexp-extended:使sed支持扩展正则表达式;


script:

'AddressesCommand'


Addresses(地址定界):

1.空地址:对所有文件的所有行进行处理;

2.单地址:sed对于能够匹配该地址的那唯一一行进行处理;

num:表示行号;

/pattern/:能够匹配该模式的所有行;

$:表示文档最后一行

3.地址范围:

addr1,addr2:从addr1开始到addr2结束的中间所有行;

例如:2,8

first~step:从first标记的行号开始,以step所代表的数字为步长;

例如:1~2, 2~2

addr1,+N:从addr1开始,包括addr1所在行,并继续向后计算N行;

例如:2,+7相当于2,2+7

addr1,~N:从addr1开始,包括addr1所在行,向后计算addr1*N行;

例如:2,~5相当于2,2*5

/pattern1/,/pattern2/:从被pattern1匹配的第一行开始计算,一直到被/pattern2/匹配到的第一行结束;


Command(处理命令):

=:显示被模式匹配的行的行号

例如:sed -n '/^$/=' /etc/grub2.cfg

a \text:在被模式匹配的行的后面追加text的内容,支持使用\n换行,从而实现多行追加;

i \text:在被模式匹配的行的前面插入text的内容,支持使用\n换行,从而实现多行插入;

c \text:将被模式匹配的行的修改为text的内容,支持使用\n换行,从而实现一行变多行;

d:在模式空间中删除被模式匹配的行;这样的行不能再进行标准输出;

注意:在使用d命令的时候,不宜使用-n选项;

p:显示模式空间中被模式匹配的行;

注意:在使用p命令的时候,通常会搭配-n选项;

w filepath:将模式空间中被模式匹配的行,另存到filepath文件中;

r filepath:将filepath文件的内容追加至模式空间中被模式匹配的行之后;

!Command:在模式空间中被模式匹配的行,不执行Command命令;相反,未被模式匹配的行,参会执行Command命令

s///:查找替换,分隔符可以任意更换,只要相同即可;

s@@@, s###, s,,,

s/pattern/text/[control]

s@/etc/fstab@/etc/mtab@


pattern:计划查找并替换的内容

text:要替换的结果

control:如何进行替换

g:行内全部替换

p:显示替换成功的行

w filepath:将替换成功的行另存到filepath文件中;


支持后向引用:

s/\(string\)/&/

s/\(string\)/\1/


高级编辑命令:

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行覆盖至模式空间

N:追加匹配到的行的下一行至模式空间

d: 删除模式空间中的行

D:删除多行模式空间中的所有行


示例:

sed -n 'n;p' FILE

sed '1!G;h;$!d' FILE

sed '$!N;$!D' FILE

sed '$!d' FILE

sed ‘G’ FILE

sed ‘g’ FILE

sed ‘/^$/d;G’ FILE

sed 'n;d' FILE

sed -n '1!G;h;$p' FILE



文件查找:按照文件名或文件属性来搜索文件;

locate

模糊查找:

基于专用的数据库进行查找,数据库应该事先创建,并且定期更新;

可以使用updatedb命令手动更新locate数据库;

查找速度非常快,查找精确到非常有限;


find

精确查找:

查找精度高,速度略慢;

在指定的位置进行文件名或文件属性的遍历扫描;强烈不建议对根目录进行find操作;

实时查找;

使用find命令只能搜索当前用户具有读取和执行权限的目录;


find命令:

find - search for files in a directory hierarchy

find [OPTIONS...] [查找路径] [查找条件] [处理动作]

查找路径:默认为当前工作目录,可以指定具体的目录路径;

查找条件:进行本次搜索的标准,可以是文件名、文件大小、文件类型、文件权限等等;默认是指定目录中的所有文件;

处理动作:对于符合条件的文件进行某个处理操作;默认将查找结果输出到显示器;


根据文件名查找:

-name 文件名称,支持使用Globbing,(*, ?, [], [^])

-iname 文件名称,忽略字母大小写,支持使用Globbing,(*, ?, [], [^])


根据文件的inode编号查找:

-inum inode编号:通过给定的inode编号查找对应的文件名及路径;

-samefile name:通过给定的文件名查找对应的inode编号,进而确定所有具有该inode编号的文件名及路径;

-links n:查找链接数为n的所有文件;


根据正则表达式查找:

-regex pattern:以pattern匹配整个文件路径字符串,而不仅仅是给定文件的名称;


根据文件的属主和属组进行查找:

-user uname:根据属主为指定用户的用户名进行查找

-uid UID:根据属主为某个UID进行查找

-group gname:

-gid GID:


-nogroup:在文件的属组上没有组对应的组名;

-nouser:在文件的属主上没有用户对应的用户名;


根据文件的类型查找:

-type 文件类型:

b:块设备

c:字符设备

d:目录文件

f:普通文件

l:符号链接文件

p:管道文件

s:套接字文件

-xtype 文件类型:符号链接文件的匹配需要配合其他的选项;


根据时间戳进行查找:

以天为单位:

-atime [+|-]n:根据访问时间查找

-ctime [+|-]n:根据改变时间查找

-mtime [+|-]n:根据修改时间查找

n:[n,n+1)

+n:[n+1,+∞)

-n:[now,n)

以分钟为单位:

-amin [+|-]n

-cmin [+|-]n

-mmin [+|-]n


例子:

5-28-11-18 

-mtime -3

5-25-11-18

-mtime 3

5-24-11-18

-mtime +3


根据文件的大小进行查找:

-size [+|-]n[cwbkMG]

n:(n-1,n]

-n:[0,n-1]

+n:(n,+∞)


例子:

find -size +2k

当前目录下所有大于2KB的文件;

find -size 2k

当前目录下所有1KB-2KB之间的文件;

find -size -2k

当前目录下所有小于1KB的文件;


组合条件:

-a:逻辑与,默认可以省略;

-o:逻辑或

-not, !:逻辑非


逻辑组合条件遵循德摩根定律:

非(A 与 B) == 非A 或 非B

非(A 或 B) == 非A 与 非B


根据权限查找:

-perm [/|-]mode

mode:精确匹配指定的权限

/mode:隐含了逻辑或的关系,任何一个权限位的权限中只要能有一个权限匹配,即可满足条件;

-mode:隐含了逻辑与的关系,每一个权限位的权限中都必须同时包含指定权限位,才能满足条件;


所有都有 取反 任意一个没有 

! ( a与b与c ) = !a 或 !b 或 !c

所有都没有 取反 任意一个有

! ( !a与!b与!c ) = a 或 b 或 c


处理动作:

-print:输出到显示屏幕,默认的动作;

-ls:对与查找到的结果执行ls -li命令显示;

-exec COMMAND {} \;:

-ok COMMAND {} \;:

对于查找到的结果执行COMMAND命令;

区别:

-exec是非交互式的;

-ok是交互式的;

{}:占位符,用来引用被find命令查找到的所有的文件的路径信息;


-exec和-ok的取代执行操作:

chmod a-r $(find -perm -444 -type f)

find -perm -444 -type f | xargs chmod a-r


注意:管道输送的是纯字符串信息,所以如果管道之后的命令不是处理字符串的命令,需要使用xargs命令将其转换成能够被后面命令处理的参数;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章