文本處理工具find查找與xargs傳遞uniq去重與sort排序

find命令
Linux find命令用來在指定目錄下查找文件。任何位於參數以前的字符串都將被視爲欲查找的目錄名。若是使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。而且將查找到的子目錄和文件所有進行顯示。php

參數說明 :node

find 根據下列規則判斷 path 和 expression,在命令列上第一個 - ( ) , ! 以前的部份爲 path,以後的是 expression。若是 path 是空字串則使用目前路徑,若是 expression 是空字串則使用 -print 爲預設 expression。linux

expression 中可以使用的選項有二三十個之多,在此只介紹最經常使用的部份。nginx

-type 按照文件類型去查找
b:塊設備文件;
c:字符設備文件;
d:目錄文件;
p: 命名管道;
f: 普通文件;
l: 符號連接文件; git

-exec 至關於shell執行命令好比rm,mkdir,touch,等docker

-mtime 修改時間以前的文件,好比3天以前的,通常用於日誌清理進行匹配shell

-mount, -xdev : 只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件express

-amin n : 在過去 n 分鐘內被讀取過json

-anewer file : 比文件 file 更晚被讀取過的文件vim

-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
相關文章
相關標籤/搜索