文本处理工具find查找与xargs传递uniq去重与sort排序

谁说胖子不能爱 提交于 2020-02-26 00:03:40

find命令
Linux find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

参数说明 :

find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

-type 按照文件类型去查找
b:块设备文件;
c:字符设备文件;
d:目录文件;
p: 命名管道;
f: 普通文件;
l: 符号链接文件;

-exec 相当于shell执行命令比如rm,mkdir,touch,等

-mtime 修改时间之前的文件,比如3天之前的,一般用于日志清理进行匹配

-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

-amin n : 在过去 n 分钟内被读取过

-anewer file : 比文件 file 更晚被读取过的文件

-atime n : 在过去n天内被读取过的文件

-cmin n : 在过去 n 分钟内被修改过

-cnewer file :比文件 file 更新的文件

-ctime n : 在过去n天内被修改过的文件

-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。

-ok 一般使用rm的时候会用到,-ok rm {} \;
选择y为删除,选择n为不删除

查看git-eureka下或者当前目录下结尾以jar的文件

[root@zhaocheng ~]# find git-eureka/ -name '*.jar'
git-eureka/eureka-service/target/eureka-service.jar
[root@zhaocheng ~]# find . -name "*.jar"
./pp/eureka-service/target/eureka-service.jar
./git-eureka/eureka-service/target/eureka-service.jar

查找出00目录下的目录 -d为目录,-f为一般文件

[root@zhaocheng ~]# find 00 -type d
00
00/.git
00/.git/objects
00/.git/objects/pack
00/.git/objects/52

[root@zhaocheng ~]# find 00 -type f
00/eureka-service-target.zip
00/eureka.yaml
00/.git/config
00/.git/description
00/.git/objects/52/c6e76bc253b21e1e59074e5730edb74b0af399

1>访问时间(access time 简写为atime)
2>修改时间(modify time 简写为mtime)
3>状态修改时间(change time 简写为ctime)
找出当前目录下有进行访问的目录

[root@zhaocheng ~]# find . -atime -10
./number.txt
./.viminfo
./filetest
./fileteste
./.cache/abrt/lastnotification
./vim
./harbor-offline-installer-v1.10.1.tgz
./filetest2

去微服务的logs目录下找到40天以前的日志,并删除,exec相当于shell命令,可以执行ls touch rm等相关操作

[root@localhost]# find /data/deploy/rebuild2/restful-workorder/ROOT/logs/ -mtime +40 -name "*.log" -exec ls {} \;
/data/deploy/jinre/restful-workorder/ROOT/logs/restful-2019-11-28.log
/data/deploy/jinre/restful-workorder/ROOT/logs/restful-2019-11-27.log
/data/deploy/jinre/restful-workorder/ROOT/logs/restful-2019-11-22.log
/data/deploy/jinre/restful-workorder/ROOT/logs/restful-2019-11-23.log
/data/deploy/jinre/restful-workorder/ROOT/logs/restful-2019-11-25.log
/data/deploy/jinre/restful-workorder/ROOT/logs/restful-2019-11-26.log
[root@sitWeb ROOT]# find /data/deploy/jinre/restful-workorder/ROOT/logs/ -mtime +40 -name "*.log" -exec rm -rf  {} \;

或者使用find与|xargs去进行删除log的日志

[root@zhaocheng log]# find /var/log/anaconda/
/var/log/anaconda/
/var/log/anaconda/storage.log
/var/log/anaconda/ifcfg.log
/var/log/anaconda/syslog
/var/log/anaconda/a
/var/log/anaconda/ks-script-A2uRCN.log
/var/log/anaconda/program.log
/var/log/anaconda/anaconda.log
/var/log/anaconda/packaging.log
/var/log/anaconda/ks-script-LPeMYl.log
/var/log/anaconda/journal.log
[root@zhaocheng log]# find /var/log/anaconda/ -name '*log' |xargs rm

或者在删除的时候用上-ok rm {} \; 这里会提示要不要删除,y为确认删除,n为不删除

[root@localhost ~]# find /var/log/ -name "*.gz" -size +2M -ok rm {} \;
< rm ... /var/log/secure-201912161576437482.gz > ? n
< rm ... /var/log/secure-202001111578684841.gz > ? n
< rm ... /var/log/secure-201912301577646721.gz > ? n
< rm ... /var/log/secure-201911221574363161.gz > ? n
< rm ... /var/log/secure-202001271580065561.gz > ? n
< rm ... /var/log/secure-201912241577130301.gz > ? n
< rm ... /var/log/secure-202001051578164821.gz > ? n
< rm ... /var/log/secure-202002091581191341.gz > ? n
< rm ... /var/log/secure-201912041575402301.gz > ? n
< rm ... /var/log/secure-201912111576006622.gz > ? n

比如你想找nginx.conf的配置文件放在了什么位置,想查看有没有相关php的配置,-name,找到符合-name的文件

[root@localhost scripts]# find / -name nginx.conf
/usr/local/nginx/conf/nginx.conf
/root/nginx/nginx-1.16.1/conf/nginx.conf

[root@localhost scripts]# find /root/nginx/nginx-1.16.1/conf/ -name  "*.conf" -exec grep php {} \;
        #location ~ \.php$ {
        #location ~ \.php$ {
#fastcgi_index  index.php;

将yum.repos.d下的repo源移动到bak下,{}就是里面的内容,后面跟目录

[root@localhost ~]# find /etc/yum.repos.d/ -name "*.repo" -exec mv {} /etc/yum.repos.d/bak \;
[root@localhost ~]# ls /etc/yum.repos.d/
bak

find命令与grep命令连用,找出/root下以filetest的文件,找出以halt的行

[root@localhost ~]# find /root/ -name "filetest" -exec grep "halt" {} \;
#halt:x:7:0:halt:/sbin:/sbin/halt

find命令与sed命令连用,找出/root下以filetest的文件,找出以halt的行,将它的以#开头的注释删除掉

[root@localhost ~]# find /root/ -name "filetest" -exec grep "halt" {} \;|sed 's/^#/halt&/' 
halt#halt:x:7:0:halt:/sbin:/sbin/halt

find命令与awk命令连用,找出/root下filetest这个文件,过滤出以halt的行,并以:为分隔符打印它的第二列

[root@localhost ~]# find /root/ -name "filetest" -exec grep "halt" {} \;|awk -F ":" '{print $2}'
x

查找当前文件下,大于30M的文件,xargs过滤符,一般find过滤的时候和管道一起使用

[root@zhaocheng git-eureka]# find . -type f -size +30M |xargs du -sh
46M     ./eureka-service/target/eureka-service.jar
40M     ./eureka-service.zip
40M     ./.git/objects/c8/aeecf5dbe33c9e24a049738fcccc2aa8b4ff10

找出/目录下大于50M的文件并查看文件大小,进行倒着排序,type类型一般用户指定f为文件,或者d为目录,-size大小,xargs进行管道统计,sort -n是指定数字,r是倒着排序

[root@zhaocheng ~]# find / -type f -size +50M |xargs du -sh |sort -nr
find: ‘/proc/8705/task/8705/fdinfo/6’: No such file or directory
find: ‘/proc/8705/fdinfo/5’: No such file or directory
500M    /opt/binary_pkg.gz
268M    /opt/binary_pkg/image.tar.gz
157M    /data/soft/logstash-7.5.0.tar.gz
136M    /var/lib/rpm/Packages
136M    /usr/local/qcloud/YunJing/VulnerDetect/yhvs/Packages

对于docker来讲运行的每个容器都会产生日志,也就是它的工作目录/var/lib/docker/containers/xxx/xxx-json.log
我们平时清理的话也是需要将这个目录进行清理,现在去找出这个目录里面大于2G的log,删除日志一般需要使用cat /dev/null >xxx-json.log,使用rm -rf删除正在写入的日志磁盘空间不会减少

[root@k8s-node1 ~]# find /var/lib/docker/containers/ -name *-json.log -size +2G |xargs du -sh |sort -nr

找出前20行内比较大的目录,进行倒着排序
-h, –human-readable 以比较阅读的方式输出文件大小信息 (例如,1K 234M 2G)。注:该选项在很多其他命令(df, ls)中也有效。
-m 以兆字节(M)为计算单位
–max-depth=N 只列出深度小于max-depth的目录和文件的信息 –max-depth=0 的时候效果跟–s是 一样

[root@zhaocheng ~]# du -hm --max-depth=2 |sort -nr |head -20
642     .
126     ./git-eureka
86      ./pp
81      ./99/.git
81      ./99
81      ./88/.git

uniq 命令删除文件中的重复行。 uniq 命令读取由 InFile 参数指定的标准输入或文件。该命令首先比较相邻的行,然后除去第二行和该行的后续副本。

用法:uniq[选项]…(输入[输出]]
从输入(或标准输入)中过滤相邻的匹配行,
写入到输出(或标准输出)。

以这个文件为示例

[root@zhaocheng ~]# cat filetest
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt

参数解释
-c 按出现的次数计算前缀行数
-d 只打印重复的行
-D 打印所有重复的行

如果没有选项,匹配的行将合并到第一个出现的行。

[root@zhaocheng ~]# uniq filetest
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt

-c将文本中所有的字段进行统计,有一样的就会统计出来

[root@zhaocheng ~]# uniq -c filetest
      3 root:x:0:0:root:/root:/bin/bash
      1 bin:x:1:1:bin:/bin:/sbin/nologin
      1 daemon:x:2:2:daemon:/sbin:/sbin/nologin
      1 adm:x:3:4:adm:/var/adm:/sbin/nologin
      1 halt:x:7:0:halt:/sbin:/sbin/halt

-d只打印重复的行

[root@zhaocheng ~]# uniq -d filetest
root:x:0:0:root:/root:/bin/bash

-D将所有的重复的行都打印出来,-d只将重复的行打印一次

[root@zhaocheng ~]# uniq -D filetest
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

sort
用法:排序[选项]…[文件]…
或者:[选项]…——files0-from = F
将所有文件的排序连接写入标准输出。
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-f 排序时,忽略大小写字母。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o <输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t <分隔字符> 指定排序时所用的栏位分隔字符。
-k 选择以哪个区间进行排序。

[root@zhaocheng ~]# sort filetest
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

这里换成数字的话,那么就需要使用sort -n去进行排序

[root@zhaocheng ~]# sort -n number.txt 
2
3
5
7
56
65
80

-r的话就是进行倒序进行排列

[root@zhaocheng ~]# sort -n -r number.txt 
80
65
56
7
5
3
2

比如在我们的linux/var/log下有很多的日志文件,比如有系统的计划任务的,等等,但是里面的文件也比较多,可以通过sort去排序,方便查看

[root@k8s-master1 log]# du -sh * |sort -n -r
755M    messages
236K    wtmp
132K    cron-20200216
132K    cron-20200209
132K    cron-20200202
132K    cron-20200126
68K     cloud-init.log
52K     cron
36K     dmesg
34M     audit
25M     sa
8.0K    tuned
8.0K    boot.log-20191021

sort -u可以也可以进行排序以及去重

[root@zhaocheng ~]# sort -u filetest
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
root:x:0:0:root:/root:/bin/bash

将我们的输出的内容进行保存,这里就需要-o,存储到指定文件

[root@zhaocheng ~]# sort -n -r number.txt -o number.txt 
[root@zhaocheng ~]# cat number.txt 
9865
890
876
56
55
34
6
4
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!