shell 中 grep、sed、awk 命令

來源:互聯網
上載者:User

標籤: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定位

行號定位

  • 定位某個特定的行nn是一個整數,表示定位到文本的第n行;
  • 定位某段連續的行n,mnm都是整數,表示定位到起始行為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稱為位置參數,即上面的行定位;commandsed所提供的子命令,用來實現編輯操作;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指令檔

可以將多個子命令寫成尾碼名為.sedsed指令檔,sed指令檔內容只需將各個子命令依次列出來,不必使用引號,若將多個子命令寫在同一行,則不同子命令之間需使用分號隔開。調用sed指令檔的格式如下:

sed -f script
awk命令 awk命令的基本文法

awk命令是一個文本處理工具,其基本文法如下所示:

awk pattern { actions }

其中,pattern表示匹配模式,actions表示要執行的操作;即對符合pattern匹配模式的文本行執行actions操作;若省略pattern匹配模式,則表示對所有文本行執行actions操作;若省略pattern
匹配模式,則把匹配成功的文本行列印輸出;但是不能同時省略patternactions

pattern匹配模式可以是以下其中一種:

  • Regex;
  • 關聯運算式;
  • 模式1,模式2:指定一行的範圍;
  • BEGIN:指定在第一行文本被處理之前所發生的操作;
  • END:指定在最後一行文本被讀取之後發送的操作;

actions命令由一個或多個命令、函數或者運算式組成,他們之間由分行符號或分號隔開,並位於大括弧內,一般有以下四種情況:

  • 變數或數組賦值;
  • 輸出命令,例如printfprint
  • 內建函數;
  • 流量控制語句,例如ifwhilefor語句;

awk命令的執行方式:

  • 通過命令列執行:其文法:
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 命令

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.