linux下字元處理工具grep,sed,awk

2021-06-01 09:21:40 字數 3457 閱讀 8891

linux下寫shell指令碼基本上都會或多或少的處理一些瑣碎的文字處理,這其中就會使用到不同的文字處理工具或命令,與windows下的batch指令碼相比,linux的shell本身也是有一些字元處理的能力的,但是比較難記和使用,而且功能不夠強大,使用起來不是很舒服。下面來介紹一下linux中常用的幾個文字處理工具:

1 grep 命令

grep [-acivn] "searchstr" 【filename】

引數:-a 在二進位制檔案中以文字形式搜尋

-c 計算並返回查到到的此數【c代表count】

-i 忽略大小寫匹配【i代表ignore case】

-v 反向輸出,僅輸出與搜尋字元不匹配的內容

-n 輸出結果的時候同時輸出在原檔案內的行號

-e 使用擴充套件正則模式【e代表expand】

"searchstr"

可以是具體的字串,也可以是正規表示式,當使用正則時可以配合-e引數

filename 

指定搜尋的原內容,是可選項,不選時預設以當前目錄為引數,還可以通過管道命令來傳輸

2 sed 工具[該工具用於行間的內容操作,如增刪改,查詢替換]

sed [-nefr] [操作行為] filename

引數:-n  安靜模式,僅顯示被處理的行【n代表silent】

-e  在命令列上進行sed操作編輯【e代表edit】

-f   將sed命令寫入乙個檔案內,-f filename 則執行該檔案下的sed命令

-r   設定支援擴充套件的正規表示式

操作行為:

格式1:[n1[,n2]動作]

n1,n2代表操作的範圍的起始和終了的行數值,都是可選的。

格式2:/pattern/ 動作

pattern 是字元內容,然後sed會匹配包含該內容的行,可以使用正則匹配

動作的內容有:

c  替換操作範圍內的內容【c代表change】

d  刪除操作範圍內的內容【d代表delete】 

i   當前行的上一行插入一行內容【i代表insert】

p  列印某行行的內容【p代表print】 sed '3p' 列印

s  搜尋及替換所搜尋的內容,可以使用正則【s代表search】,使用方式類似於vi中的替換句法

格式:s/search/replace/flag

flag: 為數字時代表對第幾次匹配的項操作

為g是代表全域性範圍內適用,global

為p時表示應列印替換後的內容

為w file時表示替換結果寫入到指定檔案內,而不改變原檔案內容

y  轉換命令,將指定的字元換為期望的字元,是但字元處理和轉換。如sed '2,4y/1234/abcd/' 

所有1都轉換成a,2->b,3->c, 4->d。若指定了重複的轉換則以第一次指定的為準。比如1指定了2個轉換符,則第一次指定     的生效

w filename 將選項的內容寫入到指定檔案中。如:sed '2,4w test.txt' inputfile 將inputfile中的2-4行的內容寫入到test檔案裡

r filename 將從filename檔案中讀取內容寫入到指定的行中。如:sed '2r test.txt' inputfile 是將test檔案中的內容讀出來寫入到inptufile檔案的第二行後面,即插入到第三行前面。等價於cat test.txt | sed '2a' inputfile

此外在對操作物件需要進行多種操作行為時可以使用組合命令: 如:

sed '2'

舉例:

last | sed '2,5d'   將刪除第二和第五行之間的內容

last | sed '1,20s/^$/test/g' 全域性範圍內搜尋空行並替換為test字元   

3 awk 工具【該工具用於處理有欄位規則的行內內容,並支援格式化輸出】

awk [options] '條件型別1 條件型別2....' filename

options"

-f fs  指定fs變數的初始值

-f  filename   指定讀取程式的檔案【即存放awk指令碼操作的檔案】

-v var=value  定義awk的臨時變數及值,而後可以在awk中使用變數

-mf n  指定最大的字段數【max field】

-mr n  指定最大的記錄數【max record】

-w keyword  指定相容模式

內建變數:

nf 當前行的字段總數 [number of field]

nr 當前為止已處理的行數,即當前行號 [number of row]

$0,$1,....$n   $0代表當前行的內容,$1代表當前行被分割後的第乙個欄位的內容

fs  當前的字段分割符。預設為空格 [file splitter]

rs  當前的行分割符。預設為回車

fieldwidths  定義數字字段顯示的寬度

ofs  輸出字段分割符,預設空格

ors  輸出行分割符,預設回車

條件比較操作符:

>

<

>=

<= ==

!=用於條件型別的的條件比較運算,通常是用行內變數的比較結果來判斷是否執行相應的動作 如:

nf==10

$1>3

條件選項的正則運用:

條件選項可以是任何的表示式,但主要還是利用awk自身的變數值進行判斷,當條件為空時預設為無條件執行動作,有條件但為假時則不執行其後的動作;此外條件還可以是正則匹配表達時

如:awk '/^a/ '   ##當前行匹配以a開頭成功時則執行後面的列印 

上面正則匹配的範圍是整行的內容,如果只想匹配指定欄位的內容,則可以這樣使用:

awk '$n ~ /^1/ '    ##通過~符號規定了正則的匹配操作範圍【這裡是字段n】,~叫做匹配操作符               

動作內容:

內容必須放{}大擴弧中,其內就是具體的執行的語句,可以是一句,多句,使用;逗號分割 如:

##普通輸出

##格式化輸出

此外awk的語句還可以使用結構化命令,如分支,迴圈等 如:

if (condition)

else if(condition)

else

while (condition)

for (i=1;i<3;i++)

注:awk的執行是按行號依次迴圈內容的,如果想在所有行執行對awk進行設定並生效的話,那麼就需要使用關鍵字begin

在所有行處理完之後還要做後期處理操作,則可以使用end關鍵字 如:

awk 'begin $1 > 3 end '       ##在執行第一行之前設定分割符為:冒號。

linux的檔案處理工具

檔案檢視命令 cat,nl,tac,rev cat 命令 選項 e 顯示行結束符 n 對顯示出的每一行進行編號 a 顯示所有控制符 b 非空行編號 s 壓縮連續的空行成一行 more 分頁檢視檔案 d 顯示翻頁及退出提示 less 一頁一頁地檢視檔案或stdin輸出 檢視時有用的命令包括 文字 搜尋...

linux日誌分割處理工具logrotate

logrotate 程式是乙個日誌檔案管理工具。用來把舊的日誌檔案刪除,並建立新的日誌檔案,我們把它叫做 轉儲 我們可以根據日誌檔案的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程式來執行。logrotate 程式還可以用於壓縮日誌檔案,以及傳送日誌到指定的e mail logrota...

linux日誌分割處理工具logrotate

logrotate 程式是乙個日誌檔案管理工具。用來把舊的日誌檔案刪除,並建立新的日誌檔案,我們把它叫做 轉儲 我們可以根據日誌檔案的大小,也可以根據其天數來轉儲,這個過程一般通過 cron 程式來執行。logrotate 程式還可以用於壓縮日誌檔案,以及傳送日誌到指定的e mail logrota...