Linux高級命令 ==> find、grep、sed、awk

1、findphp

  find命令用來在指定目錄下查找文件。若是使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。而且將查找到的子目錄和文件所有進行顯示。html

語法mysql

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

經常使用選項:git

-name  查找根目錄及其子目錄下全部以 log 結尾的文件,文件名區分大小寫,例如:find / -name '*logf'正則表達式

-iname      查找當前目錄及其子目錄下全部文件名爲 test 的文件,文件名不區分大小寫,例如:find . -name testsql

-user    查找文件所屬用戶爲 mysql 的全部文件,例如:find . -user mysqlexpress

-group      查找文件所屬組爲 git 的全部文件,例如:find . -group gitide

-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 | !  非 

2、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
grep 示例

3、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\} 須要轉義 
. 表示任意字符 
* 表示零個或者多個 
\+ 一次或屢次  
\? 零次或一次    
\| 表示或語法

4、awk

http://www.javashuo.com/article/p-rabsooij-eq.html (轉) 

5、grep、sed、awk總結

  • grep:適合單純的查找或匹配文本;
  • sed:適合對匹配到的文本進行編輯;
  • awk:適合對文本進行較複雜的格式化處理;
相關文章
相關標籤/搜索