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/}重複m到n次先前字元
/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個、m到n個
1.5 POSIX字符集
[:alnum:]表示文字和數字
[:alpha:]
[:digit:]表示數字
[:xdigit:]表示十六進位制數字
[:graph:]表示非空格、控制字元等的其它非空字元
[:lower:]小寫字元
[:upper:]大寫字元
[:cntrl:]控制字元
[:print:]可列印字元
[:punct:]標點符號
[:space:]空白字元,如空格、製表符、換行符
1.6 例項
①從一堆URL中提取出非IP類URL:# grep "^[^0-9]/{2,3/}/." final.result >final_no_ip.result
②取出不包含James的記錄:#grep –n –v James datafile
③取出以K、k、A、a開頭的記錄:#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.txt有1.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做新增括號的處理。
3.Awk
3.1 何為Awk
Awk取名於三個作者的姓氏。它是一種資料驅動的程式語言,用於在*nix下對文字和資料進行處理,它支援使用者自定義函式和正則表示式,是一種強大的程式設計工具。
Awk逐行掃描檔案,當該行匹配指定模式時,就對其執行指定操作,直到處理到輸入檔案末尾。其一般格式為:pattern {action}。
3.2 Awk選項
-Ffs 指定域分隔符,後跟字串或RE
-fscriptfile 從檔案中讀取awk命令,後跟檔名
-vvar=val 變數賦值
-Whelp顯示幫助資訊,使用該命令可以查詢其它很多選項
3.3 模式
Awk的模式可以有:/正則表示式/、關係表示式、模式匹配表示式(~或者!~)、模式,模式(指定範圍)、BEGIN、END。
3.4 操作
Awk的操作有:輸出、變數或陣列賦值、函式、邏輯控制。
3.5 主要環境變數
$0當前記錄
$n當前記錄的第n個域
FILENAME 當前檔名
FS域分隔符,預設為任何空格
NF當前記錄的域數目
NR當前記錄數,即行號
FNR 同上,但相對於檔案
3.6 基本正則和POSIX字符集
參考上述grep和sed。
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