標籤:grep shell sed awk
grep
命令
grep
命令基本文法
grep
命令是列印匹配文本行,其全稱為 Global Search Regular Expression and Print out the line;基本文法如下:
grep [OPTIONS] PATTERN [FILE...]grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
其中,OPTIONS
表示選項;PATTERN
表示匹配模式,匹配模式可以是字串、變數、Regex,若匹配模式中含義空格,則需要使用雙引號將匹配模式引起來;FILE
表示一系列檔案;grep
命令從檔案中搜尋滿足指定匹配模式的文本行,並列印出來。
在前面文章《Regex》可知,Regex的分類為:
- 基本Regex(Basic Regular Expression):Basic RegEx,簡稱 BRE
- 擴充Regex(Extended Regular Expression):Extended RegEx,簡稱 ERE
- Perl Regex(Perl Regular Expression):Perl RegEx,簡稱 PCRE;
grep
命令根據不同的參數支援不同的Regex:
grep
命令後不跟任何參數(預設),則表示要使用“BRE”;
grep
命令後跟-E
參數,則表示要使用“ERE”;
grep
命令後跟-P
參數,則表示要使用“PCRE”;
常用OPTIONS
選項如下表所示:
選項 |
說明 |
-E |
指定 PATTERN 匹配模式為擴充Regex |
-F |
指定 PATTERN 匹配模式為固定的字串 |
-G |
指定 PATTERN 匹配模式為基本Regex |
-P |
指定 PATTERN 匹配模式為 Perl Regex |
|
|
-e PATTERN |
指定 PATTERN 為一個或多個搜尋模式 |
-f FILE |
指定包含搜尋模式的 FILE |
-i |
匹配是忽略字母大小寫 |
-v |
顯示所有與匹配模式不匹配的文本行 |
-w |
執行單詞搜尋 |
-x |
顯示與指定模式精確匹配而不含其他字元的文本行 |
-y |
與選項 -i 相同功能 |
|
|
-c |
只列印匹配的文本行的行數,不顯示匹配內容 |
-l |
只顯示匹配文本行的檔案名稱,不顯示匹配內容 |
-n |
列出所有匹配的文本行,並顯示行號 |
-r |
遞迴搜尋目錄(目前的目錄及其各級子目錄) |
-s |
不顯示錯誤資訊 |
流編輯器
sed
sed
命令
sed
命令從檔案或者標準輸入中一次讀取一行資料,將該行資料複製到緩衝區,然後讀取命令列或指令碼的編輯子命令,對緩衝區中的文本行進行編輯。重複此工作,直到所有文本行都處理完畢。
sed
命令編輯的是檔案是原始檔案在緩衝區中的副本,並不影響原始檔案,但是可以把編輯結果通過輸出重新導向儲存起來。
sed
命令的基本文法如下所示:
sed [OPTION]... {script} [input-file]...
常用選項OPTION
如下表所示:
選項 |
說明 |
-n |
取消預設輸出 |
-e script |
允許執行多個指令碼 |
-f script-file |
從指令檔中讀取命令 |
-i |
直接修改原始檔案 |
-l N |
指定行長度為 N |
-r |
在指令碼中使用擴充Regex |
-s |
把檔案作為單獨檔案 |
-u |
最低限度的緩衝輸入與輸出 |
文本行定位
sed
命令提供了兩種方式來實現文本行的定位:行號定位、Regex定位
行號定位
- 定位某個特定的行
n
:n
是一個整數,表示定位到文本的第n
行;
- 定位某段連續的行
n,m
:n
和m
都是整數,表示定位到起始行為n
,終止行為m
的文本行;
- 指定起始行和步長
start~step
:起始行為start
,步長為step
;
- 第一行
1
和最後一行$
:1
表示第一行,$
表示最後一行;
- 指定某行後面的幾行
n,+x
:表示從第n
行開始到後面的x
行;
Regex定位
sed
命令使用Regex定位文本行的文法如下所示:
#regexp 表示Regex/regexp/
sed
命令的常用操作
sed
命令的常用編輯命令有:列印、刪除、增加、替換;其基本文法如下所示:
[address1[,address2]] command [argument]
其中address
稱為位置參數,即上面的行定位;command
是sed
所提供的子命令,用來實現編輯操作;argument
表示子命令的選項參數;
列印文本
sed
命令中可通過位置參數和p
命令列印所需要的文本行,其文法如下所示:
[address1[,address2]] p
例如:
#! /bin/bash#輸出第1~4行文本,注意1,3p之間是單引號sed -n ‘1,3p‘ test.txt#輸出以Lin開頭的文本行result=`sed -n ‘/^Lin/ p‘ test.txt`echo "$result"
替換文本
sed
命令中可通過位置參數和s
子命令替換文本行,其文法如下所示:
[address1[,address2]] s/pattern/replacemen/[flag]
flag
為替換標誌,不同值會影響s
子命令的行為;flag
常用取值如下表所示:
取值 |
說明 |
g |
全域匹配,會替換文本行所有符合規則的字串 |
p |
替換第一個符合規則的字串,並將緩衝區輸出到標準輸出 |
w |
替換第一個符合規則的字串,並將受影響的行輸出到磁碟檔案中 |
十進位數n |
替換文本行中第n個符合規則的字串 |
空 |
若不指定flag值,替換文本行中第一個符合規則的字串 |
刪除文本
sed
命令中可通過位置參數和d
子命令刪除文本行,其文法如下所示:
[address1[,address2]] d
增加文本
追加文本
sed
命令中可通過位置參數和a
子命令追加文本行,其文法如下所示:
#將string插入到address1位置後面[address1] a string
插入文本
sed
命令中可通過位置參數和i
子命令插入文本行,其文法如下所示:
#將string插入到address1位置前面[address1] i string
組合命令
sed
命令支援將多個子命令組合在一起使用;具體方式如下所示:
- 使用
-e
選項:-e
選項可以將多個子命令組合在一起使用;例如:
#! /bin/bash#將全部小寫字母 e 替換成大寫字母 E,並列印第 1 行到第 3 行文本行result=`sed -n -e ‘s/e/E/g‘ -e ‘1,3 p‘ test.txt`echo "$result"
sed -e ‘command1; command2...‘ filename
例如:
#! /bin/bash#將全部小寫字母 e 替換成大寫字母 E,並列印第 1 行到第 3 行文本行result=`sed -n -e ‘s/e/E/g; 1,3 p‘ test.txt`echo "$result"
address{ command1 command2 command3 ...}#或[address] { command1;command2;command3;...}
sed
指令檔
可以將多個子命令寫成尾碼名為.sed
的sed
指令檔,sed
指令檔內容只需將各個子命令依次列出來,不必使用引號,若將多個子命令寫在同一行,則不同子命令之間需使用分號隔開。調用sed
指令檔的格式如下:
sed -f script
awk
命令
awk
命令的基本文法
awk
命令是一個文本處理工具,其基本文法如下所示:
awk pattern { actions }
其中,pattern
表示匹配模式,actions
表示要執行的操作;即對符合pattern
匹配模式的文本行執行actions
操作;若省略pattern
匹配模式,則表示對所有文本行執行actions
操作;若省略pattern
匹配模式,則把匹配成功的文本行列印輸出;但是不能同時省略pattern
和actions
。
pattern
匹配模式可以是以下其中一種:
- Regex;
- 關聯運算式;
- 模式
1
,模式2
:指定一行的範圍;
BEGIN
:指定在第一行文本被處理之前所發生的操作;
END
:指定在最後一行文本被讀取之後發送的操作;
actions
命令由一個或多個命令、函數或者運算式組成,他們之間由分行符號或分號隔開,並位於大括弧內,一般有以下四種情況:
- 變數或數組賦值;
- 輸出命令,例如
printf
或print
;
- 內建函數;
- 流量控制語句,例如
if
、while
或for
語句;
awk
命令的執行方式:
awk ‘awk程式語句‘ 資料檔案
#注意:awk指令檔是尾碼名為.awk的檔案awk -f awk指令檔 資料檔案
- 可執行指令檔:即在
shell
檔案中指定解析器為#! /bin/awk -f
awk
命令的匹配模式
在awk
命令的匹配模式主要包括:關聯運算式、Regex、混合模式、區間模式、BEGIN
模式、END
模式等。
關聯運算式
awk
命令中的關係運算子如下表所示:
運算子 |
說明 |
> |
大於 |
>= |
大於等於 |
< |
小於 |
<= |
小於等於 |
== |
等於 |
!= |
不等於 |
~ |
匹配運算:例如$1~/^A 表示匹配第一個欄位以字元A 開頭的記錄 |
!~ |
不匹配運算 |
Regex
awk
支援以Regex為匹配模式,其基本文法如下所示:
#regexp 表示Regex/regexp/
例如:輸出以字元u開頭的文本行
#! /bin/bash#filename:test.shresult=`awk ‘/^u/ {print}‘ shell.md`echo "$result"#輸出結果:$ sh test.sh unset variable_nameunset varuntiluntilunset -f 函數名
混合模式
在awk
命令的匹配模式中,可以通過邏輯運算子使用多個運算式組成命令;基本邏輯運算子如下表所示:
運算子 |
說明 |
&& |
邏輯與 |
|| |
邏輯或 |
! |
邏輯非 |
區間模式
awk
命令支援區間模式,其文法如下:
pattern1, pattern2
例如:第一個匹配模式是:以字串one
開頭的文本行;第二個匹配模式是:第3
欄位等於14
的文本行;所有符合這兩個匹配模式之間的文本行都會被輸出;
#!/bin/bash#filename:test.shresult=`awk ‘/^one/ , $3==14 {print}‘ test.txt`echo "$result"#執行結果:$ sh test.sh one 10 20 30two 15 25 20three 20 15 31four 16 26 35five 11 14 40
BEGIN
模式
BEGIN
模式是awk
命令一種特殊的內建模式,在awk
讀取資料之前對執行的操作;
例如:
#! /usr/bin/awk -f#filename:test.shBEGIN { print "Beging operator." }/^one/ , $3==14 {print}#執行結果:$ ./test.sh test.txtBeging operator.one 10 20 30two 15 25 20three 20 15 31four 16 26 35five 11 14 40
END
模式
END
模式是在處理完資料之後執行的操作;例如:
#! /usr/bin/awk -f# /usr/bin/env awk -f#filename:test.shBEGIN { print "Beging operator." print "===================="}/^one/ , $3==14 {print}END { print "====================" print "Ending operator."}#執行結果:$ ./test.sh test.txtBeging operator.====================one 10 20 30two 15 25 20three 20 15 31four 16 26 35five 11 14 40====================Ending operator.
awk
變數
awk
中的使用者自訂的變數一般在BEGIN
模式中定義;
系統內建變數
awk
的常用系統內建變數如下表所示:
變數 |
說明 |
$0 |
目前記錄(存放著整個行的內容) |
$1~$n |
目前記錄的第n個欄位,欄位間由FS分隔 |
FS |
輸入欄位分隔符號 預設是空格或Tab |
NF |
目前記錄中的欄位個數,就是有多少列 |
NR |
已經讀出的記錄數,就是行號,從1開始,如果有多個檔案話,這個值也是不斷累加中 |
FNR |
目前記錄數,與NR不同的是,這個值會是各個檔案自己的行號 |
RS |
輸入的記錄分隔字元, 預設為分行符號 |
OFS |
輸出欄位分隔符號, 預設也是空格 |
ORS |
輸出的記錄分隔字元,預設為分行符號 |
FILENAME |
當前輸入檔案的名字 |
運算子
awk
命令支援常用的運算子:算術運算子、賦值運算子、條件運算子、邏輯運演算法、關係運算子等操作;
算術運算子
awk
命令直接支援的算術運算子有:加+、減-、乘*、除/、模運算%、指數運算^;
賦值運算子
awk
命令常用的賦值運算子有:=、+=、-=、*=、/=、%=、^=;
條件運算子
awk
命令的條件運算子文法如下所示:
運算式?值1:值2
邏輯運演算法
awk
命令支援的邏輯運算子:&&、||、!;
關係運算子
awk
命令支援的關係運算子:>、>=、<、<=、==、!=、~、!~;
awk
函數
awk
提供了許多系統函數,使用者也可以自訂函數;
字串函數
常用的字串函數有:
函數 |
說明 |
index(string1, string2) |
返回 string2 在string1中第一次出現的位置 |
length(string) |
返回string的長度 |
match(string,regexp) |
返回string中符合regexp的子字串 |
split(string,array,seperator) |
根據分隔字元seperator,將字串string分隔成多個欄位,並儲存到數組array中 |
sub(regexp,replacement,string) |
將字串string第一個符合regexp的子字串替換成replacement |
gsub(regexp,replacement,string) |
將字串string中符合regexp的全部子字串都替換成replacement |
substr(string,start,[length]) |
從字串string的start位置開始截取長度為length(若指定了length,否則一直截取到字串string結束)字串 |
算術函數
常用的算術函數有:int(x)、sqrt(x)、exp(x)、log(x)、sin(x)、cos(x)、rand(x)、srand(x);
shell 中 grep、sed、awk 命令