1. 程式人生 > >Grep Sed Awk 筆記和例項

Grep Sed Awk 筆記和例項

1.Grep

1.1何為Grep

Grep表示Global search Regular Expression and Print out the line,是一種強大的文字搜尋工具。它從若干個檔案中搜索字串模板,模板後的所有字串被視為檔名,因此如果模板中有空格則需要被引用,並預設將搜尋結果送到終端。

如果搜尋成功,則返回0;如果無法匹配到模板,返回1;如果目標檔案不存在,返回2

1.2Grep選項

-數字同時顯示匹配行的上下若干行,如-2表示同時顯示匹配行的上下2行;示例:#grep -2 “meet” test.txt

-b 在匹配行前面列印該行所在塊;

-c 只打印匹配的行數;

-f File

從檔案中提取要匹配的模板;

-h 搜尋多個檔案時,預設會在匹配行前面顯示所在檔名,該引數取消此功能;示例:#grep –h “meet” test.txt 1.txt

-i 忽略大小寫;

-q 不顯示匹配行,只返回退出狀態;

-l 顯示匹配模板的檔案列表;示例:grep –l “meet” *

-L -l的取反,顯示不匹配模板的檔案列表;

-n 在匹配行前顯示行號;

-s 不顯示錯誤資訊;

-v 只顯示不匹配的行;

-V 顯示版本資訊;

-w 結合/</>匹配單詞;

1.3 基本正則

^匹配行開始

$匹配行末尾

.匹配一個非換行字元

*匹配任意個先前字元

[]匹配指定範圍內字元

[^]

匹配不屬於指定範圍的字元

/<匹配單詞開始

/>匹配單詞結束

/{m/}重複m次先前字元

/{m,/}重複至少m次先前字元

/{m,n/}重複mn次先前字元

/w匹配文字和數字

/W/w的取反,匹配非文字和數字

/b設定邊界,即只匹配單詞;如’/bschedule/b’不會匹配”scheduled”

1.4擴充套件正則egrep或者grep –E

+ 匹配至少一個先前字元

? 匹配0個或1個先前字元

| 匹配其中之一,如a|b|c

() 在字串中插入RE,如abc(d|e)fg

{m}{m,}{m,n}同上表示匹配m個、至少m個、mn

1.5 POSIX字符集

[:alnum:]表示文字和數字

[:alpha:]

表示文字

[:digit:]表示數字

[:xdigit:]表示十六進位制數字

[:graph:]表示非空格、控制字元等的其它非空字元

[:lower:]小寫字元

[:upper:]大寫字元

[:cntrl:]控制字元

[:print:]可列印字元

[:punct:]標點符號

[:space:]空白字元,如空格、製表符、換行符

1.6 例項

從一堆URL中提取出非IPURL# grep "^[^0-9]/{2,3/}/." final.result >final_no_ip.result

取出不包含James的記錄:#grep –n –v James datafile

取出以KkAa開頭的記錄:#grep –i –n ^[AaKk] datafile

2.Sed

2.1何為Sed

Sed表示streams editor,它一次讀入一行記錄到緩衝區(稱為“模式空間”),然後根據命令處理緩衝區中的內容,再送到終端顯示。如此迴圈,直到檔案結束。

2.2Sed選項

-e 表示允許多個命令執行,示例:sed –e ‘s/a/A’ –e ‘s/b/B’ data.txt

-f 後面指定sed指令碼檔案,如果沒有-e-f則第一個非選項引數視為sed命令

-n 取消自動列印模式空間

-r 在指令碼中使用擴充套件正則表示式

-s 將輸入檔案視為獨立檔案,而非連續長輸入

--help

--version

2.3 Sed命令

2.3.1 替換命令s

s表示substitution,替換,是sed中最重要的命令。示例:echo today | sed ‘s/day/night/’,得到的輸出結果為“tonight”。

替換命令中分隔符為“/”,所以如果要替換“/”就需要進行轉義“//”,多個這樣的正反斜線被稱為“Picket Fence”。

&s命令中該符號表示匹配串。示例:echo today | sed ‘s/day/(&)/’,得到的輸出結果為“to(day)”。

/1sed可以記憶/1/9,分別表示第1到第9個匹配串。

2.3.2 替換命令s的末尾標記

/g表示全域性搜尋。示例:sed ‘s/day/night/g’

/p表示輸出當前行。示例:sed ‘s/day/(&)/p’

/w將處理結果寫到檔案中。示例:sed ‘s/day/(&)/w day.txt’

2.3.3 指定sed操作範圍

通過數字指定行範圍:sed ‘1,100 s/a/A’

通過模式指定行範圍:sed ‘/start/,/stop/ s/a/A/’

通過混合指定行範圍:sed ‘1,/stop/ s/a/A/’

2.3.4 刪除命令d

刪除指定行:sed ‘1, d’

刪除範圍行:sed ‘1,$ d’,表示刪除第一行到最後一行。

刪除匹配行:sed ‘/^$/ d’,表示刪除空行。

2.3.5 輸出命令p

輸出指定行:sed ‘1 p’

輸出範圍行:sed ‘1,10 p’

輸出匹配行:sed ‘/^#/ p’

2.3.6 取反命令!

不輸出匹配行:sed ‘/^# !p’

刪除非指定行:sed ‘1,10 !d’,即刪除11到最後一行。

2.3.7 使用{}組合命令

即可以在{}中放置多條命令。

2.3.8 檔案讀寫與追加、插入、改變

新增a表示將行新增到匹配行後面,插入i則是插入到前面,命令c則是改變當前行。

讀檔案使用r命令,寫檔案使用w命令。

示例:sed ‘/meet/ r 2.txt’ < 1.txt,如果2.txt1.txt的匹配行,則會在該匹配行後面顯示2.txt的內容。

示例:echo abc123 | sed ‘/abc/ a hello’,得到結果為:

abc123

hello

示例:echo abc123 | sed ‘/abc/ i hello’,得到結果為:

hello

abc123

示例:echo abc123 | sed ‘/abc/ c hello’,則將匹配行換成hello

2.3.9 獲取下一行n

示例:sed ‘/meet/{n; s/meet/(&)/;}’ meet.txt,每次匹配到meet時,就讀入下一行做處理,如示例中是對下一行的meet做新增括號的處理。

3Awk

3.1 何為Awk

Awk取名於三個作者的姓氏。它是一種資料驅動的程式語言,用於在*nix下對文字和資料進行處理,它支援使用者自定義函式和正則表示式,是一種強大的程式設計工具。

Awk逐行掃描檔案,當該行匹配指定模式時,就對其執行指定操作,直到處理到輸入檔案末尾。其一般格式為:pattern {action}

3.2 Awk選項

-Ffs 指定域分隔符,後跟字串或RE

-fscriptfile 從檔案中讀取awk命令,後跟檔名

-vvar=val 變數賦值

-Whelp顯示幫助資訊,使用該命令可以查詢其它很多選項

3.3 模式

Awk的模式可以有:/正則表示式/、關係表示式、模式匹配表示式(~或者!~)、模式,模式(指定範圍)、BEGINEND

3.4 操作

Awk的操作有:輸出、變數或陣列賦值、函式、邏輯控制。

3.5 主要環境變數

$0當前記錄

$n當前記錄的第n個域

FILENAME 當前檔名

FS域分隔符,預設為任何空格

NF當前記錄的域數目

NR當前記錄數,即行號

FNR 同上,但相對於檔案

3.6 基本正則和POSIX字符集

參考上述grepsed

3.7 例項

<一個生成.csv檔案的例子:

輸出:#awk ‘{print $0}’ datafile

只輸出第一個域:#awk ‘{print $1}’ datafile

顯示以350結尾的行號:#awk ‘/350$/ {print NR}’datafile

if語句輸出第一個域為Sir的行號:#awk ‘{if($1==”Sir”){print NR}}’datafile