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.www58058.com/96470