一、find
find命令用來在指定目錄下查找文件。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。
語法
find path -option [ -print ] [ -exec -ok command ] {} \;
常用選項:
-name 查找根目錄及其子目錄下所有以 log 結尾的文件,文件名區分大小寫,例如:find / -name '*logf'
-iname 查找當前目錄及其子目錄下所有文件名為 test 的文件,文件名不區分大小寫,例如:find . -name test
-user 查找文件所屬用戶為 mysql 的所有文件,例如:find . -user mysql
-group 查找文件所屬組為 git 的所有文件,例如:find . -group git
-type 根據類型查找:如下
- f 文件 find . -type f
- d 目錄 find . -type d
- c 字符設備文件 find . -type c
- b 塊設備文件 find . -type b
- l 鏈接文件 find . -type l
- p 管道文件 find . -type p
-size 根據文件大小查詢
- -n 小於 大小為 n 的文件
- +n 大於 大小為 n 的文件
- 查找 /ect 目錄下,小於 10000 字節的文件。 find /etc -size +10000c
- 查找 /etc 目錄下,大於 1M 的文件。find /etc -size -1M
-mtime 根據文件更改時間查找
- -n n 天以內修改的文件。
- +n n 天以外修改的文件。
- n 正好 n天 修改的文件
- 查詢 /etc 目錄下,5天以內修改 且以 conf 結尾的文件。 find /etc -mtime -5 -name '*.conf'
- 查詢 /etc 目錄下,10天之前修改,且屬於 yangyang 的文件。 find /etc -mtime +10 -user yangyang
-mmin
- -n n 分鍾以內修改過的文件
- +n n 分鍾之前修改過的文件
- 查詢 /etc 目錄下 30分鍾 之前修改過的文件。 find /etc -mmin +30
- 查詢 /etc 目錄下 30分鍾 之前修改過的目錄。 find /etc -mmin -30 -type d
-mindepth n 從第 n 級目錄開始搜索
- 從 /etc 的第三級子目錄開始搜索。 find /etc -mindepth 3
-maxdepth n 表示至多搜索到第 n-1 級子目錄。
- 在 /etc 中搜索符合條件的文件,但最多搜索到 2級 子目錄。 find /etc -maxdepth 3 -name '*.conf'
- find /etc -type f -name '*.conf' -size +10k -maxdepthc 2
操作查找到的文件:
-print 打印輸出。 默認的選項,即打印出找到的結果。
-exec 對搜索到的文件執行特定的操作,固定的格式為:-exec 'commond' {} \; 注意:{} 表示查詢的結果。
- 搜索 /etc 目錄下的文件(非目錄),文件以 conf 結尾,且大於 10k,然后將其刪除。
- find /etc -type f -name '*.conf' -size +10k -exec rm -f {} \;
- 將 /data/log/ 目錄下以 .log 結尾的文件,且更改時間在 7 天以上的刪除。
- find /data/log -name '*.log' -mtime +7 -exec rm -f \;
- 搜索條件同 例1 一樣,但是不刪除,只是將其復制到 /root/conf 目錄下
- find /etc -type f -name '*.conf' -size +10k -exec cp {} /root/conf/ \;
-ok 和 -exec 的功能一樣,只是每次操作都會給用戶提示。
邏輯運算符:
-a 與 (默認情況查詢條件之間都是 與 的關系)
-o 或
-not | ! 非
二、grep
grep(global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
語法:
grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動作>][-e<范本樣式>][-f<范本文件>][--help][范本樣式][文件或目錄...]
選項:
選項 | 描述 |
-a | 不要忽略二進制數據 |
-A<顯示列數> | 除了顯示符合范本樣式的那一行之外,並顯示該行之后的內容 |
-b | 在顯示符合范本樣式的那一行之外,並顯示該行之前的內容 |
-c | 計算符合范本樣式的列數 |
-C<顯示列數>或-<顯示列數> | 除了顯示符合范本樣式的那一列之外,並顯示該列之前后的內容 |
-d<進行動作> | 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將回報信息並停止動作 |
-e<范本樣式> | 指定字符串作為查找文件內容的范本樣式 |
-E | 將范本樣式為延伸的普通表示法來使用,意味着使用能使用擴展正則表達式 |
-f<范本文件> | 指定范本文件,其內容有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每一列的范本樣式 |
-F | 將范本樣式視為固定字符串的列表 |
-G | 將范本樣式視為普通的表示法來使用 |
-h | 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱 |
-H | 在顯示符合范本樣式的那一列之前,標示該列的文件名稱 |
-i | 忽略字符大小寫的差別 |
-l | 列出文件內容符合指定的范本樣式的文件名稱 |
-L | 列出文件內容不符合指定的范本樣式的文件名稱 |
-n | 在顯示符合范本樣式的那一列之前,標示出該列的編號 |
-q | 不顯示任何信息 |
-R/-r | 此參數的效果和指定“-d recurse”參數相同 |
-s | 不顯示錯誤信息 |
-v | 反轉查找 |
-w | 只顯示全字符合的列 |
-x | 只顯示全列符合的列 |
-y | 此參數效果跟“-i”相同 |
-o | 只輸出文件中匹配到的部分 |
示例:

# 在文件中搜索一個單詞,命令會返回一個包含“match_pattern”的文本行: grep match_pattern file_name grep "match_pattern" file_name # 在多個文件中查找 grep "match_pattern" file_1 file_2 file_3 ... # 輸出除之外的所有行 -v 選項 grep -v "match_pattern" file_name # 使用正則表達式 -E 選項 grep -E "[1-9]+" egrep "[1-9]+" # 只輸出文件中匹配到的部分 -o 選項 grep -o "match_pattern" file_name # 統計文件或者文本中包含匹配字符串的行數 -c 選項 grep -c "text" file_name # 輸出包含匹配字符串的行數 -n 選項 grep "text" -n file_name cat file_name | grep "text" -n grep "text" -n file_1 file_2 # 打印樣式匹配所位於的字符或字節偏移 echo gun is not unix | grep -b -o "not" # 搜索多個文件並查找匹配文本在哪些文件中 grep -l "text" file1 file2 file3... # 在多級目錄中對文本進行遞歸搜索 grep "text" . -r -n # 忽略匹配樣式中的字符大小寫 echo "hello world" | grep -i "HELLO" # 選項 -e 制動多個匹配樣式 echo this is a text line | grep -e "is" -e "line" -o #只在目錄中所有的.php和.html文件中遞歸搜索字符"main()" grep "main()" . -r --include *.{php,html} #在搜索結果中排除所有README文件 grep "main()" . -r --exclude "README" #在搜索結果中排除filelist文件列表里的文件 grep "main()" . -r --exclude-from filelist #不會輸出任何信息,如果命令運行成功返回0,失敗則返回非0值。一般用於條件測試 grep -q "test" filename #顯示匹配某個結果之后的3行,使用 -A 選項: seq 10 | grep "5" -A 3 5 6 7 8 #顯示匹配某個結果之前的3行,使用 -B 選項: seq 10 | grep "5" -B 3 2 3 4 5 #顯示匹配某個結果的前三行和后三行,使用 -C 選項: seq 10 | grep "5" -C 3 2 3 4 5 6 7 8 #如果匹配結果有多個,會用“--”作為各匹配結果之間的分隔符: echo -e "a\nb\nc\na\nb\nc" | grep a -A 1 a b -- a b
三、sed
sed 命令是利用腳本來處理文本文件。
sed 可依照腳本的指令來處理、編輯文本文件。
Sed 主要用來自動編輯一個或多個文件、簡化對文件的反復操作、編寫轉換程序等。
語法:
sed [選項] [腳本命令] 文件名
選項與參數
- -n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
- -e :直接在命令列模式上進行 sed 的動作編輯;
- -f :直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作;
- -r :sed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法)
- -i :直接修改讀取的文件內容,而不是輸出到終端。
動作:
- a :新增行, a 的后面可以是字串,而這些字串會在新的一行出現(目前的下一行)
- c :取代行, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行
- d :刪除行,因為是刪除,所以 d 后面通常不接任何參數,直接刪除地址表示的行;
- i :插入行, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
- p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行
- s :替換,可以直接進行替換的工作,通常這個 s 的動作可以搭配正規表示法,例如 1,20s/old/new/g 一般是替換符合條件的字符串而不是整行
一般動作的前面會有一個地址的限制,例如 [地址]動作,表示我們的動作要操作的行。下面我們通過具體的例子直觀的看看 sed 的使用方法。
刪除行
// example.txt 內容如下 11 aa 22 bb 33 cc 23 dd 55 2e sed '1,2d' example.txt 輸出: 33 cc 23 dd 55 2e
其中1,2d中的d表示刪除,而d前面的表示刪除的行的地址,而1,2表示一個地址范圍,也就是刪除第1行和第2行。地址范圍的表示一般是 m,n 表示對m和n行之間的所有行進行操作,也包含第m行和第n行。sed的地址尋址中可以使用$表示最后一行,例如 m,$ 表示對m行以及其后面的所有行進行操作,包括最后一樣。m,$d就是刪除m行以及其后面的所有行內容。當然我們還可以對某一行進行操作,例如2d表示僅僅刪除第2行。除了使用數字范圍 m,n 表示多行區間,以及m表示單行以外,我們還可以使用正則表達式選出符合條件的行,並對這些行進行操作,同樣的是上面的文件:
sed '/2/d' example.txt 輸出: 11 aa 33 cc
上面的命令中 /2/ 是一個正則表達式,在sed中正則表達式是寫在 /.../ 兩個斜杠中間的,這個正則的意思是尋找所有包含2的行,執行相應的操作,也就是刪除所有包含2的行,如果我們只想刪除以2開頭的行呢,只需要修改一下正則表達式就可以了:
sed '/^2/d' example.txt 輸出: 11 aa 33 cc 55 2e
新增行
sed '1a hello world' example.txt 輸出: 11 aa hello world 22 bb 33 cc 23 dd 55 2e
其中a命令表示在指定行的后面附加一行,1a則是在第一行的后面添加一行,添加的內容就是a后面的內容,如果a的前面沒有地址限定則在所有行的后面都會添加指定的字符串
sed '1i hello world' example.txt 輸出: hello world 11 aa 22 bb 33 cc 23 dd 55 2e
命令i表示在指定的行的前面插入一行,插入的內容為其后面的字符串
替換行
sed '1c hello world' example.txt 輸出: hello world 22 bb 33 cc 23 dd 55 2e
命令c會替換指定的行的所有內容,替換成其后面的字符串,所有的新增,刪除,替換行,這些命令前面的地址修飾都可以指定地址空間,也都可以使用正則表達式,命令會應用在選出的符合地址條件的所有行上面,例如:
sed '/^2/c hello world' example.txt 輸出: 11 aa hello world 33 cc hello world 55 2e
替換以2開頭的行,其內容是c命令后面的字符串
替換部分字符串而不是整行
sed中除了上面的命令是針對整行進行操作的之外,還提供一個替換命令,該命令對某一行中的部分字符串進行操作,下面舉一個簡單的例子,還是同樣的文本內容,執行下面的命令:
sed 's/aa/AA/' example.txt 輸出: 11 AA 22 bb 33 cc 23 dd 55 2e
我們這里說的就是s命令,執行的結果是我們文件中的 aa 被替換成 AA ,我們看一下s命令后面接的是3個斜杠分隔的兩串字符串,其含義是 s/待替換的字符串/新字符串/ 也就是說使用后面的 AA 替換文件中出現的前面的 aa 。實際上這里的替換僅僅替換每一行遇到的第一個aa,我們修改一下文件的內容:
// example.txt 11 aa 22 bb 33 cc 23 dd 55 2e 66 aaff ccaa zz ggaa sed 's/aa/AA/' example.txt 輸出: 11 AA 22 bb 33 cc 23 dd 55 2e 66 AAff ccaa zz ggAA
可以看到第6行的ccaa中的aa是沒有被替換的,也就是說此時僅僅替換了每一行搜索到的第一個aa字符串進行操作,那么如果要對一行里面的所有的符合條件的字符串都做替換操作呢,我們可以使用參數g,例如修改命令如下:
sed 's/aa/AA/g' example.txt 輸出: 11 AA 22 bb 33 cc 23 dd 55 2e 66 AAff ccAA zz ggAA
在最后一個斜杠后面加上g選項之后,表示進行全局替換,也就是說一行中所有符合條件的舊字符串都會被替換成新字符串,而不僅僅是第一個。與其他針對行的操作一樣,s命令也可以進行地址選擇,其地址使用方法與我們之前的一樣,也就是在s的前面加上地址空間限定,例如:
sed '1s/aa/AA/g' example.txt 輸出: 11 AA 22 bb 33 cc 23 dd 55 2e 66 aaff ccaa zz ggaa
可以看到僅僅對第一行進行了替換操作,其他的地址限定方法同樣也是可以使用的,我們可以使用m,n的限定,例如:
sed '5,$s/aa/AA/g' example.txt 輸出: 11 aa 22 bb 33 cc 23 dd 55 2e 66 AAff ccAA zz ggAA
表示對第5行直到文件末尾的所有行進行搜索替換操作,同樣s命令的地址限定也支持使用正則表達式限定符合條件的行,然后在這些行中進行字符串的搜索替換操作,例如:
sed '/^[0-9]/s/aa/AA/g' example.txt 輸出: 11 AA 22 bb 33 cc 23 dd 55 2e 66 AAff ccAA zz ggaa
我們在s命令前面添加了 /^[0-9]/ 這個修飾,該正則表達式表示對所有以數字開頭的行,執行s操作
另外一個要說明的是 s/待替換的字符串/新字符串/ 這種格式中 / 作為分隔符並不是一定的,當使用s命令時候,我們可以使用別的分隔符,實際上s后面緊接着的字符就是分隔符,所以不一定是 / 符號。例如:
echo 'aabbccaadd' | sed s#aa#AA#g 輸出: AAbbccAAdd
這里s命令后面跟着的#符號被當作分隔符了
搜索並輸出行內容
sed還提供一個p命令用於搜索符合條件的行,並輸出該行的內容,而不做其他的任何修改,例如:
// example.txt 11 aa 22 bb 33 cc 23 dd sed '2p' example.txt 輸出: 11 aa 22 bb 22 bb 33 cc 23 dd
可以看到第二行被輸出來了,但是sed好像將文件的所有內容輸出了一遍,而第2行則多輸出了一次,實際上sed默認情況下是會將所有標准輸入的數據又重新輸出到標准輸出的,我們可以加上 -n 選項讓sed僅僅是輸出經過處理之后的那些行,而不是輸出之前從標准輸入中獲取到的所有行內容,例如:
sed -n '2p' example.txt 輸出: 22 bb
這樣僅僅會輸出p命令的處理結果了,-n 選項一般是與p命令聯合使用的,其他的增加,刪除,替換行的命令是不需要 -n 選項的
將修改應用到文件當中
我們之前做的所有實驗,實際上都沒有修改test.txt文件的內容,也就是說我們看到的修改結果僅僅輸出到控制台上,而文件test.txt的內容是沒有修改的,我們可以使用 -i 選項告訴sed直接修改文件的內容,而不是將修改結果輸出到終端上,例如:
sed -i '2d' example.txt
命令運行之后,我們發現example.txt的第2行沒有了
sed正則中的元字符
我們知道sed中的命令前面可以使用地址范圍進行限制,表示對文件的某些符合條件的行執行相應的操作,其中我們可以使用正則表達式選出要操作的行,而sed中正則的語法可能與我們其他命令的正則語法有一些不同,這里我們有必要列出sed中常用的正則元字符:
$ 表示行尾 ^ 表示行首 [a-z0-9]表示字符范圍 [^]表示除了字符集中的字符以外的字符 sed的正則中 \(\) 和 \{m,n\} 需要轉義 . 表示任意字符 * 表示零個或者多個 \+ 一次或多次 \? 零次或一次 \| 表示或語法
四、awk
https://www.cnblogs.com/wangqiguo/p/5863266.html (轉)
五、grep、sed、awk總結
- grep:適合單純的查找或匹配文本;
- sed:適合對匹配到的文本進行編輯;
- awk:適合對文本進行較復雜的格式化處理;