一、find 查找命令
# 在目錄下查找文件并打印路徑,子目錄也會(huì)查找
find /home/test -name test.sh -print
12
命令選項(xiàng):
- -name 按照文件名查找
- -perm 按照文件權(quán)限來(lái)查找文件
- -prune 不在當(dāng)前指定的目錄查找。如果同時(shí)使用了-depth,那-prune會(huì)被忽略
- -user 按文件屬主來(lái)查找文件
- -group 按所屬組來(lái)查找文件
- -mtime -n +n 按照文件更改時(shí)間來(lái)查找文件
- -nogroup 查找無(wú)有效所屬組的文件,即在該所屬組在/etc/groups中不存在
- -nouser 查找無(wú)有效屬主的文件,即該文件的屬主在/etc/passwd中不存在
- -newer file1 !file2 查找更改時(shí)間比f(wàn)ile1新但比f(wàn)ile2老的文件
- -type 查找某一類型的文件
- -size n[c]查找文件工度為n塊的文件,帶有c時(shí)表示文件長(zhǎng)度以字節(jié)計(jì)算
- -depth 在查找文件地,首先查找當(dāng)前目錄中的文件,然后在其子目錄中查找。
- -fstype 查找位于某一類型雇傭系統(tǒng)中的文件
- -mount 在查找文件地不跨越文件系統(tǒng)mount點(diǎn)
- -cpio 對(duì)匹配的文件使用cpio命令,將這些文件備份到磁帶設(shè)備中
# 模糊搜索,在$HOME目錄下查找后綴txt的文件
find ~ -name "*.txt" -print
# 使用正則表達(dá)式,查找當(dāng)前目錄及子目錄里大寫開頭的文件
find . -name "[A-Z]*" -print
# 在/etc里找host開頭的文件
find /etc -name "host*" -print
# 查找兩個(gè)小寫字母開頭,后跟兩個(gè)數(shù)字的文件
find . -name "[a-z][a-z][0-9][0-9].txt" -print
# 當(dāng)前目錄下找權(quán)限為755的文件
find . -perm 755 -print
# 忽略/Apps/bin目錄進(jìn)行查找
find /apps -name "/apps/bin" -prune -o -print
# 用ls -l 列出所找到的文件
find . -type f -exec ls -l {} ;
# 刪除5天前的日志
find . -name "*.LOG" -mtime +5 -ok rm {} ;
find /home/hap/src/* -name "*.o" -exec rm {} ;
# 使用xargs
# 用grep命令在所有的普通文件中搜索device單詞
find / -type f -print | xargs grep "device"
123456789101112131415161718192021
# 查找大文件
find . -type -size +200M
# 查找大于400M的文件
find . -type f -size +400M -print0 | xargs -0 du -h
1234
二、文本搜索工具 grep
全稱是 Global Regular Expression Print,使用正則表達(dá)式搜索文本。命令格式: grep [options]主要參數(shù):
- -a或--text 不要忽略二進(jìn)制的數(shù)據(jù)。
- -A<顯示列數(shù)>或--after-context=<顯示列數(shù)> 顯示搜索到的那列和該列之后的內(nèi)容。
- -b或--byte-offset 在顯示符合范本樣式的那一列之前,標(biāo)示出該列第一個(gè)字符的位編號(hào)。
- -B<顯示列數(shù)>或--before-context=<顯示列數(shù)> 顯示搜索到的列和該列之前的內(nèi)容。
- -c或--count 計(jì)算符合范本樣式的列數(shù)。
- -C<顯示列數(shù)>或--context=<顯示列數(shù)>或-<顯示列數(shù)> 除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內(nèi)容。
- -d<進(jìn)行動(dòng)作>或--directories=<進(jìn)行動(dòng)作> 當(dāng)指定要查找的是目錄而非文件時(shí),必須使用這項(xiàng)參數(shù),否則grep指令將回報(bào)信息并停止動(dòng)作。
- -e<范本樣式>或--regexp=<范本樣式> 指定字符串做為查找文件內(nèi)容的范本樣式。
- -E或--extended-regexp 將范本樣式為延伸的普通表示法來(lái)使用。
- -f<范本文件>或--file=<范本文件> 指定范本文件,其內(nèi)容含有一個(gè)或多個(gè)范本樣式,讓grep查找符合范本條件的文件內(nèi)容,格式為每列一個(gè)范本樣式。
- -F或--fixed-regexp 將范本樣式視為固定字符串的列表。
- -G或--basic-regexp 將范本樣式視為普通的表示法來(lái)使用。
- -h或--no-filename 在顯示符合范本樣式的那一列之前,不標(biāo)示該列所屬的文件名稱。
- -H或--with-filename 在顯示符合范本樣式的那一列之前,表示該列所屬的文件名稱。
- -i或--ignore-case 忽略字符大小寫的差別。
- -l或--file-with-matches 列出文件內(nèi)容符合指定的范本樣式的文件名稱。
- -L或--files-without-match 列出文件內(nèi)容不符合指定的范本樣式的文件名稱。
- -n或--line-number 在顯示符合范本樣式的那一列之前,標(biāo)示出該列的列數(shù)編號(hào)。
- -q或--quiet或--silent 不顯示任何信息。
- -r或--recursive 此參數(shù)的效果和指定“-d recurse”參數(shù)相同。
- -s或--no-messages 不顯示錯(cuò)誤信息。
- -v或--revert-match 反轉(zhuǎn)查找。
- -V或--version 顯示版本信息。
- -w或--word-regexp 只顯示全字符合的列。
- -x或--line-regexp 只顯示全列符合的列。
- -y 此參數(shù)的效果和指定“-i”參數(shù)相同。
- --help 在線幫助。
- --color=auto 將搜索到的內(nèi)容標(biāo)上顏色。
pattern 正則表達(dá)式主要參數(shù):
- :忽略正則表達(dá)式中特殊字符的原有含義。
- ^:匹配正則表達(dá)式的開始行。
- $ :匹配正則表達(dá)式的結(jié)束行。
- <:從匹配正則表達(dá) 式的行開始。
- >:到匹配正則表達(dá)式的行結(jié)束。
- [ ]:?jiǎn)蝹€(gè)字符,如[A]即A符合要求 。
- [ - ]:范圍,如[A-Z],即A、B、C一直到Z都符合要求 。
- .:所有的單個(gè)字符。
- * :有字符,長(zhǎng)度可以為0。
示例
# 從.txt文件中查找包含'a'字符串的文本文件
grep 'a' *.txt --color=auto
# 搜索包含連續(xù)4個(gè)字符的文件
grep '[a-z]{4}' *.txt
1234
三 、 sed 從文件中查找
sed 是利用腳本來(lái)處理文本文件,可以自動(dòng)編輯一個(gè)或多個(gè)文件,簡(jiǎn)化重復(fù)操作。
命令格式sed [-nefr] [操作]
參數(shù)說(shuō)明
- -e<script>或--expression=<script> 以選項(xiàng)中指定的script來(lái)處理輸入的文本文件。
- -f<script文件>或--file=<script文件> 以選項(xiàng)中指定的script文件來(lái)處理輸入的文本文件。
- -h或--help 顯示幫助。
- -n或--quiet或--silent 僅顯示script處理后的結(jié)果。
- -V或--version 顯示版本信息。
動(dòng)作說(shuō)明
- a :新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~
- c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
- d :刪除,因?yàn)槭莿h除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行);
- p :打印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
- s:取代,可以直接進(jìn)行取代的工作哩!通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦!
sed -n '2p' sed.txt 打印第2行
sed -n '1,3p' sed.txt 打印1~3行
sed -n '1,3p' sed.txt >sed.tmp 1~3行輸出到sed.tmp文件里
sed -n '1,$p' sed.txt 顯示全文
sed -n '1p' sed.txt 打印首行
sed -n '$p' sed.txt 打印最后一行
sed '2p' sed.txt 輸出全部文本,然后輸出第2行
sed -n '/should/'p sed.txt 查找should的行
sed -n '/should/=' sed.txt 輸出匹配的行號(hào)
sed -n '/./'p sed.txt 特殊字符查詢,需要進(jìn)行轉(zhuǎn)義
sed '1,3d' sed.txt 刪除1~3行
sed '/should/d' sed.txt 刪除包含should的行
sed 's/PS/ps/' sed.txt 替換每行第一個(gè)單詞
sed 's/PS/ps/g' sed.txt 全文替換
sed '1,3 s/should/SHOULD/g' sed.txt 指定行替換
sed '1 s/should/SHOULD/g' sed.txt 指定行范圍替換
控制字符輸入方式:
^M
1.Ctrl+v
2.M
3.釋放Ctrl
123456789101112131415161718192021
四、awk
與sed 相比, awk 傾向于一行中分成數(shù)個(gè)字段來(lái)處理,適合處理小型的文本數(shù)據(jù)。
awk處理過(guò)程: 依次對(duì)每一行進(jìn)行處理,然后輸出
awk命令樣式
- awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
- [-F|-f|-v] 大參數(shù),-F指定分隔符,-f調(diào)用腳本,-v定義變量 var=value
- ' ' 引用代碼塊
- BEGIN 初始化代碼塊,在對(duì)每一行進(jìn)行處理之前,初始化代碼,主要是引用全局變量,設(shè)置FS分隔符
- // 匹配代碼塊,可以是字符串或正則表達(dá)式
- {} 命令代碼塊,包含一條或多條命令
- ; 多條命令使用分號(hào)分隔
- END 結(jié)尾代碼塊,在對(duì)每一行進(jìn)行處理之后再執(zhí)行的代碼塊,主要是進(jìn)行最終計(jì)算或輸出結(jié)尾摘要信息。
特殊要點(diǎn):
- $0 表示整個(gè)當(dāng)前行
- $1 每行第一個(gè)字段
- NF 字段數(shù)量變量
- NR 每行的記錄號(hào),多文件記錄遞增
- FNR 與NR類似,不過(guò)多文件記錄不遞增,每個(gè)文件都從1開始
- t 制表符
- n 換行符
- FS BEGIN時(shí)定義分隔符
- RS 輸入的記錄分隔符, 默認(rèn)為換行符(即文本是按一行一行輸入)
- ~ 匹配,與==相比不是精確比較
- !~ 不匹配,不精確比較
- == 等于,必須全部相等,精確比較
- != 不等于,精確比較
- && 邏輯與
- || 邏輯或
- + 匹配時(shí)表示1個(gè)或1個(gè)以上
- /[0-9][0-9]+/ 兩個(gè)或兩個(gè)以上數(shù)字
- /[0-9][0-9]*/ 一個(gè)或一個(gè)以上數(shù)字
- FILENAME 文件名
- OFS 輸出字段分隔符, 默認(rèn)也是空格,可以改為制表符等
- ORS 輸出的記錄分隔符,默認(rèn)為換行符,即處理結(jié)果也是一行一行輸出到屏幕
- -F'[:#/]' 定義三個(gè)分隔符
五、文件比較diff
diff [選項(xiàng)] <參數(shù)>常用命令選項(xiàng):
- -<行數(shù)>:指定要顯示多少行的文本。此參數(shù)必須與-c或-u參數(shù)一并使用;
- -a或--text:diff預(yù)設(shè)只會(huì)逐行比較文本文件;
- -b或--ignore-space-change:不檢查空格字符的不同;
- -B或--ignore-blank-lines:不檢查空白行;
- -c:顯示全部?jī)?nèi)容,并標(biāo)出不同之處;
- -C<行數(shù)>或--context<行數(shù)>:與執(zhí)行“-c-<行數(shù)>”指令相同;
- -d或--minimal:使用不同的演算法,以小的單位來(lái)做比較;
- -D<巨集名稱>或ifdef<巨集名稱>:此參數(shù)的輸出格式可用于前置處理器巨集;
- -e或--ed:此參數(shù)的輸出格式可用于ed的script文件;
- -f或-forward-ed:輸出的格式類似ed的script文件,但按照原來(lái)文件的順序來(lái)顯示不同處;
- -H或--speed-large-files:比較大文件時(shí),可加快速度;
- -l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若兩個(gè)文件在某幾行有所不同,而之際航同時(shí)都包含了選項(xiàng)中指定的字符或字符串,則不顯示這兩個(gè)文件的差異;
- -i或--ignore-case:不檢查大小寫的不同;
- -l或--paginate:將結(jié)果交由pr程序來(lái)分頁(yè);
- -n或--rcs:將比較結(jié)果以RCS的格式來(lái)顯示;
- -N或--new-file:在比較目錄時(shí),若文件A僅出現(xiàn)在某個(gè)目錄中,預(yù)設(shè)會(huì)顯示:Only in目錄,文件A 若使用-N參數(shù),則diff會(huì)將文件A 與一個(gè)空白的文件比較;
- -p:若比較的文件為C語(yǔ)言的程序碼文件時(shí),顯示差異所在的函數(shù)名稱;
- -P或--unidirectional-new-file:與-N類似,但只有當(dāng)?shù)诙€(gè)目錄包含了第一個(gè)目錄所沒(méi)有的文件時(shí),才會(huì)將這個(gè)文件與空白的文件做比較;
- -q或--brief:僅顯示有無(wú)差異,不顯示詳細(xì)的信息;
- -r或——recursive:比較子目錄中的文件;
- -s或--report-identical-files:若沒(méi)有發(fā)現(xiàn)任何差異,仍然顯示信息;
- -S<文件>或--starting-file<文件>:在比較目錄時(shí),從指定的文件開始比較;
- -t或--expand-tabs:在輸出時(shí),將tab字符展開;
- -T或--initial-tab:在每行前面加上tab字符以便對(duì)齊;
- -u,-U<列數(shù)>或--unified=<列數(shù)>:以合并的方式來(lái)顯示文件內(nèi)容的不同;
- -v或--version:顯示版本信息;
- -w或--ignore-all-space:忽略全部的空格字符;
- -W<寬度>或--width<寬度>:在使用-y參數(shù)時(shí),指定欄寬;
- -x<文件名或目錄>或--exclude<文件名或目錄>:不比較選項(xiàng)中所指定的文件或目錄;
- -X<文件>或--exclude-from<文件>;您可以將文件或目錄類型存成文本文件,然后在=<文件>中指定此文本文件;
- -y或--side-by-side:以并列的方式顯示文件的異同之處;
- --help:顯示幫助;
- --left-column:在使用-y參數(shù)時(shí),若兩個(gè)文件某一行內(nèi)容相同,則僅在左側(cè)的欄位顯示該行內(nèi)容;
- --suppress-common-lines:在使用-y參數(shù)時(shí),僅顯示不同之處。
# 最簡(jiǎn)單的用法
diff file1 file2
# 并排格式輸出
diff file1 file2 -y -W 50
1234
另外 cmp命令也可以進(jìn)行文件比較。由于現(xiàn)在可視化工具很多,這些命令很多人日常工作中其實(shí)很少會(huì)用到;在文件處理方面現(xiàn)在腳本語(yǔ)言Python等用來(lái)作文件處理也更方便。