查找命令,压缩工具,以及Sed

1、查找locate和find
2、处理动作-exec和参数替换xargs
3、压缩、解压缩及归档工具
4、文本处理工具sed

 

 

1、查找locate和find

 

文件的搜索和查找

 

locate

在数据库里查找,如果数据库未更新可能查找失败,但是对系统资源占用少,适合搜索旧文件

系统开机会自动建立/var/mlocate/mlocate.db

一般用法 locate  filename

locate -i 忽略大小写

locate -n N  filename 只列举前N个匹配项目

locate -r 使用正则表达式

 

手动更新数据库命令:

updatedb

 

 

实时查找工具

find

默认是递归搜索的,直接进入指定文件夹开始进入所有子目录搜索指定文件

例如搜索etc文件夹下passwd文件

find /etc/ -name passwd

可以指定搜索层级

-maxdepth level 最大搜索目录深度,指定目录为第1级

 

默认第1层就是指当前层

find /etc/ -maxdepth 1  -name passwd

/etc/passwd

 

第2层就是

find /etc/ -maxdepth 2  -name passwd

/etc/pam.d/passwd

 

-mindepth level 最小搜索目录深度

 

找特定目录下指定第n层的文件

find /data -maxdepth 3 -mindepth 3 -name f1

 

find -name 是精确搜索如果想扩展搜索可以参考以下

find /data -name “*f1*”

注意必须加双引号!

 

 

find -name 支持glob * ? [] [^]

find -iname 忽略大小写字母

find -inum 按inode号查找

find /data -inum 69

find -samefile name 相同inode号的文件 就是找硬链接

find -links n 链接数为n的文件

find -regex 支持基本正则表达式

find /data -empty

 

-user USERNAME:查找属主为指定用户(UID)的文件

-group GRPNAME: 查找属组为指定组(GID)的文件

-uid UserID:查找属主为指定的UID号的文件

-gid GroupID:查找属组为指定的GID号的文件

-nouser:查找没有属主的文件

-nogroup:查找没有属组的文件

 

根据文件类型查找:

-type TYPE:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

 

空文件或目录

-empty

find /app -type d -empty

 

组合条件:

与: -a

或: -o

非: -not, !

 

查找data目录下空的但是不能是普通文件的集合

find /data -empty -type f

/data/dd1      这里的dd1是文件夹

 

查找data目录下非空的普通文件

find /data ! -empty  -type f

 

find -prune   剪切文件

 

排除目录

查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件

find /etc -path ‘/etc/sane.d’ -a –prune -o -name “*.conf”

 

查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件

find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \)

-a -prune –o -name “*.conf

 

根据文件大小来搜索

假设有文件f1 大小 1024k   ,f2文件大小1023k  f3文件大小为595k

 

find /data -size 1k

代表搜索(1k-1k,1024]的区间

结果为

/data/f1

/data/f2

/data/f3

 

find /data -size 1024c

/data/f1

 

find /data -size -1024c 代表[0,1024-1]

 

find/data -size +1023c 代表(1023,…)

 

根据时间戳查找

以“天“为单位

-atime

-mtime

-ctime

 

-atime 3 代表[3,3+1)

-atime +3 代表[3+1,…]

-atime -3 代表[0,3)

 

以“分钟”为单位

-amin

-mmin

-cmin

 

 

根据权限查找:

-perm

默认模式是精确查找,必须完全匹配权限

 

/是任何一类(u,g,o)对象中的权限中只要能一位匹配即可。

/是或的意思       /是centos7开始使用的符号,centos6是使用+

例如

find -perm /666 -ls

 

-是代表每一类对象必须至少拥有指定的权限,是与的关系

例如

如果有f1   chomod 777 f1

则-666 也会搜索到f1

find -perm -666 -ls   -是并且的意思

find -perm 666 -ls  就是精确匹配

 

 

2、处理动作-exec和参数替换xargs

 

处理动作的命令

exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令

{}: 用于引用查找到的文件名称自身

find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性

传递给后面的命令

 

搜索指定文件并询问是否删除

find  -name “f*” -ok rm {} \;

 

处理动作

-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令

{}: 用于引用查找到的文件名称自身

find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性

传递给后面的命令

 

不询问直接删除

find -name “f*” -exec rm {} \;

 

找到的文件全部移动到mnt目录下

find -name “f*” -exec mv {} /mnt/ \;

 

找到的文件全部改名

find /mnt -name “f*” -exec mv {} {}.bak \;

 

find示例

备份配置文件,添加.orig这个扩展名

find -name “*.conf” -exec cp {} {}.orig \;

提示删除存在时间超过3天以上的joe的临时文件

find /tmp -ctime +3 -user joe -ok rm {} \;

在主目录中寻找可被其它用户写入的文件

find ~ -perm -002 -exec chmod o-w {} \;

查找/data下的权限为644,后缀为sh的普通文件,增加执行权限

find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;

查看/home的目录

find /home –type d -ls

 

 

参数替换xargs

 

由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了

 

xargs命令

xargs用于产生某个命令的参数, xargs 可以读入 stdin 的数据,并且以空格符

或回车符将 stdin 的数据分隔成为arguments

注意:文件名或者是其他意义的名词内含有空格符的情况

有些命令不能接受过多参数,命令执行可能会失败, xargs可以解决

 

例如一次创建n个文件

touch f{1..524288} 会显示参数过多而失败

这时可以用

echo f{1..10000} |xargs -n2 touch

 

xargs -n2会把参数切割成f1,f2一组然后回车换行f3,f4一组回车换行。。。再依次传送给touch命令执行。

| xargs -n1 就是把前面参数切割成1个字符一行

 

练习

1、查找/var目录下属主为root,且属组为mail的所有文件

2、查找/var目录下不属于root、 lp、 gdm的所有文件

3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是

postfix的文件

4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

5、查找/etc目录下大于1M且类型为普通文件的所有文件

6、查找/etc目录下所有用户都没有写权限的文件

7、查找/etc目录下至少有一类用户没有执行权限的文件

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

 

答案

1.find /var -user root -a -group mail

2.find /var -not -user root -a -not -user lp -a -not -user gdm -exec ls -al {} \;

3.find /var -mtime -7 -a -not -user root -not -user postfix

4.find / -nouser -o -nogroup -a -atime -7

5.find /etc -size +1M -a -type f

6.find /etc -not -perm /222

7.find /etc

8.find /etc/init.d -perm -111 -a -perm -002

 

 

3、压缩、解压缩及归档工具

 

命令:

filr-roller 压缩包名字

 

注意:linux压缩文件对后缀名敏感!

 

常用压缩后缀名:

compress/uncompress: .Z

gzip/gunzip: .gz

bzip2/bunzip2: .bz2

xz/unxz: .xz

zip/unzip

 

compress

 

compress filename

默认压缩会删除原文件,这个需要注意

 

-d 解压缩,相当于uncompress

compress -d filename.Z

 

-c结果输出至标准输出,不删除原文件

compress -c filename > m.Z

 

-v显示详情

 

uncompress 解压缩

另可以解压缩

zcat file.Z > file

 

 

gzip

-d: 解压缩,相当于gunzip

-c: 将压缩或解压缩的结果输出至标准输出

-#: 1-9,指定压缩比,值越大压缩比越大,默认是6

zcat:不显式解压缩的前提下查看文本文件内容

 

压缩并保留原文件

gzip -c file > file.gz

 

gzip -c -d file.gz > file

zcat file.gz > file

不解压缩包,查看压缩包内容

gzip -l

 

bzip2

-k: keep, 保留原文件

-d:解压缩

-#: 1-9,压缩比,默认为9

bzcat:不显式解压缩的前提下查看文本文件内容

例子:

bzip2 -k filename

 

xz

-k: keep, 保留原文件

-d:解压缩

-#: 1-9,压缩比,默认为6

xzcat: 不显式解压缩的前提下查看文本文件内容

 

 

zip/unzip

打包压缩

zip –r /testdir/sysconfig /etc/sysconfig/

一次性打包压缩文件夹/etc/sysconfig/

 

 

解包解压缩

unzip sysconfig.zip

 

cat /var/log/messages | zip messages –

cat messages | zip m1 –

 

unzip -p message > message

 

 

文件打包工具

 

tar

 

tar命令后续可以不用加-比较特殊

 

基础用法:建立打包文件data.tar

 

tar -cpvf data.tar /data

 

创建归档

tar -cpvf FILE.tar FILE…

c代表创建   f代表目录    v代表可看过程      p代表保留原有属性

tar -cpvf data.tar /data

 

查看文件大小

du -sh /data/

 

追加文件至归档: 注:不支持对压缩文件追加

tar -r -f 1.tar /data/sudo.conf /data/sudoers

 

 

预览已打包文件夹用t

tar tvf data.tar

 

解打包文件夹用 x

tar xvf data.tar

 

 

解压缩直接用以下命令,不用理会后缀名

tar xvf data.tar.gz   -C /mnt

 

结合压缩工具实现:归档并压缩

-j: bzip2, -z: gzip, -J: xz

 

重要:在打包的同时压缩

tar -zcpvf data.tar.gz  /data (打包成gz格式的压缩文件)

tar -jcpvf data.tar.bz2 /data (打包成bzip2格式的压缩文件)

tar -Jcpvf data.tar.xz /data  (打包成xz格式的压缩文件)

 

 

 

-T选项指定输入文件,-X选项指定包含要排除的文件列表

tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist

(tgz是指tar.gz)

建立文件 list.txt,内容为要打包的文件如

/etc/shadow

/boot/

建立文件exlist.txt,内容为不要打包的文件

/etc/.bashrc

然后执行

tar Jcvf list.tar.xz -T list.txt -X exlist.txt

 

打包某个目录下的全部子目录和文件并排除某个特定的目录 例如

tar cvpf  etc.tar  –exclude=/etc/sysconfig     –exclude=/etc/skel   /etc

 

分割大的 tar 文件为多份小文件:

split –b Size –d tar-file-name prefix-name

split -b 1M –d mybackup.tgz mybackup-parts

split -b 1M mybackup.tgz mybackup-parts

 

例:有大小为95M的 list.tar.xz压缩文件包把它切割成10M大小一个

split -b 10M  -d list.tar.xz  a.tar

生成的是a.tar00 a.tar01 a.tar03…a.tar09

如果不加 -d生成的后缀名会变成a.taraa a.tarab a.tarac…a.taraj

 

合并:

cat mybackup-parts* > mybackup.tar.gz

例:

cat a.tar0* > a.tar.xz

 

 

cpio

功能:复制文件从或到归档

cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以

解压以“.cpio” 或者“.tar” 结尾的文件

cpio [选项] > 文件名或者设备名

cpio [选项] < 文件名或者设备名

选项

-o 将文件拷贝打包成文件或者将文件输出到设备上

-i 解包,将打包文件解压或将设备上的备份还原到系统

-t 预览,查看文件内容或者输出到设备上的文件内容

-v 显示打包过程中的文件名称。

-d 解包生成目录,在cpio还原时,自动的建立目录

-c 一种较新的存储方式

 

 

 

 

4、文本处理工具sed

 

Stream EDitor, 行编辑器

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时

缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的

内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。

如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清

空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重

定向存储输出。

功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

 

sed默认处理完第一行以后会清除模式空间中的内容然后继续读取第二行。

 

用法:

sed [option]… ‘script’ inputfile…

常用选项:

-n:不输出模式空间内容到屏幕,即不自动打印

-e: 多点编辑

-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本

-r: 支持使用扩展正则表达式

-i.bak: 备份文件并原处编辑

-ic 在原文件编辑并复制原文件为filename+c

 

这里的script脚本是sed语言自己的脚本而不是之前的bash脚本

script:

‘地址命令’

 

地址定界:

(1) 不给地址:对全文进行处理

(2) 单地址:

#: 指定的行, $: 最后一行

/pattern/:被此处模式所能够匹配到的每一行

(3) 地址范围:

#,#p

#,+#p

例如 : seq 100 > test

sed -n  1,10p test

sed -n 1,+9p test

/pat1/,/pat2/

#,/pat1/

例如:

sed –n ‘2,/root/p’ /etc/passwd 从2行开始

 

sed -n ‘/^$/=’ file 显示空行行号

 

(4) ~:步进

1~2 奇数行

2~2 偶数行

 

编辑命令:

d: 删除模式空间匹配的行,并立即启用下一轮循环

p: 打印当前模式空间内容,追加到默认输出之后

a [\]text:在指定行后面追加文本

sed ‘/root/a\superman’ /etc/passwd行后

支持使用\n实现多行追加

i [\]text:在行前面插入文本

sed ‘/root/i\superman’ /etc/passwd 行前

c [\]text:替换行为单行或多行文本

sed ‘/root/c\superman’ /etc/passwd 代替行

或者:

sed ‘2,5a superman is me !!!’  /etc/passwd

 

 

w /path/somefile: 保存模式匹配的行至指定文件

r /path/somefile:读取指定文件的文本至模式空间中

匹配到的行后

=: 为模式空间中的行打印行号

!:模式空间中匹配行取反处理

 

 

例子:

seq 5  > f1

 

cat f1

1

2

3

4

5

 

 

sed ‘2p’ f1

1

2

2

3

4

5

 

sed -n ‘2p’ f1

2

 

例如截取第二行

ifconfig ens33 | sed -n ‘2p’

 

截取最后一行

sed -n ‘$p’ /etc/passwd

 

截取带有root的行

sed -n ‘/root/p’ /etc/passwd

 

截取root开头的行

sed -n ‘/^root/p’ /etc/passwd

 

sed支持基本正则表达式,如果要使用扩展正则表达式可以用-r

 

显示第二行到第五行

sed -n ‘2,5p’ /etc/passwd

sed -n ‘2,+3p’ /etc/passwd

 

截取从b开头的行到f开头的行

sed -n ‘/^b/’,/^f/p’ /etc/passwd

 

sed -n ‘/^b/’,/^fffff/p’ /etc/passwd

如果不存在则默认会找到尾行为止

 

步进打印

sed -n ‘1~2p’ f1

1

3

5

7

9

 

多点编辑

sed -n -e ‘2p’ -e ‘6p’ f1

2

6

 

命令行文件调用

cat > sedscript.txt

2~2p

sed -f sedscript.txt

 

 

删除特定的行用d

sed ‘2d’ f1

1

3

4

5

 

sed ‘2!d’ f1

2

 

sed -n ‘/root/!p’ /etc/passwd

打印不包括root的行

 

 

为输出行加行号

sed -n ‘/root/=’ /etc/passwd

1

5

代表第1和第10行符合条件

 

在指定的行后面添加内容用命令a

sed ‘2,5a=====’ f1

1

2

=====

3

=====

4

=====

5

=====

 

在.bashrc中包含关键字aliases的行下一行添加alias p=poweroff的别名命令

sed ‘/aliases/aalias p=poweroff’ .bashrc

这里只是显示而没有真正修改文件,如果需要修改文件需要用-i

sed -i.bak ‘/aliases/aalias p=poweroff’ .bashrc

这里是修改文件.bashrc的同时建立原未修改文件并加.bak后缀,这样做可以在修改失败以后能够恢复。

如果想在添加内容的前面增加空格可以用\

sed ‘2,5a\   =====’ f1

1

2

======

3

======

4

======

5

======

 

此用法还能支持换行追加\n还能配合\ 例如

sed “/^alias g/a\     alias rm=’rm -i’\n\   alias p=poweroff” ./.bashrc

 

如果是在指定命令行前面添加内容则是使用i

sed ‘2,5i\   =====’ f1

1

=====

2

=====

3

=====

4

=====

5

 

如果是想直接代替指定的行就用c

sed ‘2,5c\     =====’ f1

1

=====

6

7

8

9

10

 

把符合条件的行储存到文件里面用w

sed ‘2,5w f2’ f1

 

cat f2

2

3

4

5

 

把某些文件的内容读入到指定行里用r

sed ‘2,5r /etc/issue’ f1

1

2

hi

3

hi

4

hi

5

hi

 

sed ‘/User/r sed.txt’ .bashrc

 

!相当重要的功能搜索替代

s///:查找替换,支持使用其它分隔符, s@@@, s###  类似vim的设置

替换标记:

g: 行内全局替换

p: 显示替换成功的行

w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

 

例:

搜索/etc/passwd文件里的第一个root并替换成administrator

sed ‘s/root/administrator/’ /etc/passwd

如果要全局替换

sed ‘s/root/administrator/g’ /etc/passwd

 

sed -r ‘s/(root)/\1er/g’ /etc/passwd

表示把文件里的root全部替换成rooter

 

在所有行的末尾加上magedu

sed -r ‘s/(.*)/magedu\1/’ /etc/passwd

 

sed -r ‘s@(bin/bash)$@s\1@’ /etc/passwd

 

在quiet后面加 xyz

sed -r ‘s/(^GRUB_CMDLINE.*)”$/\1 xyz”/’  /etc/default/grub

或者

sed -r ‘/GRUB_CMDLINE_LINUX/s/(.*)”$/\1 xyz”/’ /etc/default/grub

或者

sed -r ‘/GRUB_CMDLINE_LINUX/s/”$/ xyz”/’ /etc/default/grub

 

重要:想替换什么都可以想截取什么都可以!

用sed取出ifconfig ens33中的ip地址

 

原理就是用sed的功能定义ip地址为\1再替换原行为\1

ifconfig ens33 | sed -n ‘2p’ | sed -r ‘s/.*inet (.*) netmask.*/\1/’

 

或者

ifconfig ens33 | sed -r ‘2!d;s/(.*inet )(.*)( net.*)/\2/’   (分成三段)

 

或者

ifconfig ens33 |sed -n ‘2p’|sed -r ‘s/.*inet//’ |sed ‘s/ netmask.*//’   (切头再切尾)

或写成

ifconfig ens33 |sed -n ‘2p’|sed -e ‘s/.*inet//’ -e ‘s/ netmask.*//’

 

把指定行的行首#去掉

只在一行里去掉

sed  ‘/^#NameVirtualHost/s/#//’ /etc/httpd/conf/httpd.conf

 

在某一段中去掉

sed ‘/#<VirtualHost/,/#<\/VirtualHost>/s/^#//g’ /etc/httpd/conf/httpd.conf

注意:这里第二段有/所以必须转义加\

 

有指定行也有某一段行同时去掉

sed -e ‘/^#NameVirtualHost/s/#//’  -e ‘/#<VirtualHost/,/#<\/VirtualHost>/s/^#//g’ /etc/httpd/conf/httpd.conf

 

 

取基名

echo “/etc/sysconfig/network” | sed -r ‘s@.*/(.*)$@\1@’

 

完美版,防止network/这种情况

echo “/etc/sysconfig/network” | sed -r ‘s@^(.*/)([^/]+)(/?$)$@\2@’

 

取dirname

echo “/etc/sysconfig/network/” | sed -r ‘s/(.*\/)([^/]+\/?$)\1/’

 

 

练习

 

1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

3、在centos6系统/root/install.log每一行行首增加#号

4、在/etc/fstab文件中不以#开头的行的行首增加#号

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名

6、利用sed 取出ifconfig命令中本机的IPv4地址

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

9、将文本文件的n和n+1行合并为一行, n为奇数行

 

答案

 

1.sed ‘s/^[  ]*//’ /etc/grub2.cfg  /

如果要删除tab开头就sed ‘s/^[ \t]*//’ /etc/grub2.cfg

 

2.sed -r ‘s/^#[ ]+//’ /etc/fstab

 

3.sed -r ‘s/^(.*)/#\1/’ /root/install.log

 

4.sed -r ‘s/^([^#].*)/#\1/’ /etc/fstab

 

5.

目录名:

echo “/etc/fstab” | sed -r ‘s@^/(.*)/([^/]+/?)$@\1@’

基名:

echo “/etc/fstab” | sed -r ‘s@^/(.*)/([^/]+/?)$@\2@’

 

6.ifconfig | sed -n ‘2p’ | sed -r ‘s/(.*addr:)(.*)(  Bcast.*)/\2/’

 

7.ls -1 /media/CentOS_6.9_Final/Packages/ | sed -r ‘s/^(.*)(.).\.rpm$/\2/’ | sort  | uniq -c

 

查看文件个数

ls -1 /media/CentOS_6.9_Final/Packages/ |wc -l

 

8.

cat /etc/init.d/functions | tr -s ” ” ” ”  | tr -s ‘[\t]’ ” ” | sed -r “s/^[ ]//”|sed ‘/^$/d’| tr ” ” “\n” |sort |uniq -c

 

9.

sed ‘N;s/\n/\t/’

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96470

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code