grep
指令
grep
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
表示比對模式,比對模式可以是字元串、變量、正規表達式,若比對模式中含義空格,則需要使用雙引号将比對模式引起來;
FILE
表示一系列檔案;
grep
指令從檔案中搜尋滿足指定比對模式的文本行,并列印出來。
在前面文章《正規表達式》可知,正規表達式的分類為:
- 基本正規表達式(Basic Regular Expression):Basic RegEx,簡稱 BRE
- 擴充正規表達式(Extended Regular Expression):Extended RegEx,簡稱 ERE
- Perl 正規表達式(Perl Regular Expression):Perl RegEx,簡稱 PCRE;
grep
指令根據不同的參數支援不同的正規表達式:
-
指令後不跟任何參數(預設),則表示要使用“BRE”;grep
-
指令後跟grep
參數,則表示要使用“ERE”;-E
-
指令後跟grep
參數,則表示要使用“PCRE”;-P
常用
OPTIONS
選項如下表所示:
選項 | 說明 |
---|---|
-E | 指定 PATTERN 比對模式為擴充正規表達式 |
-F | 指定 PATTERN 比對模式為固定的字元串 |
-G | 指定 PATTERN 比對模式為基本正規表達式 |
-P | 指定 PATTERN 比對模式為 Perl 正規表達式 |
-e PATTERN | 指定 PATTERN 為一個或多個搜尋模式 |
-f FILE | 指定包含搜尋模式的 FILE |
-i | 比對是忽略字母大小寫 |
-v | 顯示所有與比對模式不比對的文本行 |
-w | 執行單詞搜尋 |
-x | 顯示與指定模式精确比對而不含其他字元的文本行 |
-y | 與選項 -i 相同功能 |
-c | 隻列印比對的文本行的行數,不顯示比對内容 |
-l | 隻顯示比對文本行的檔案名,不顯示比對内容 |
-n | 列出所有比對的文本行,并顯示行号 |
-r | 遞歸搜尋目錄(目前目錄及其各級子目錄) |
-s | 不顯示錯誤資訊 |
流編輯器 sed
sed
sed
指令
sed
sed
指令從檔案或者标準輸入中一次讀取一行資料,将該行資料複制到緩沖區,然後讀取指令行或腳本的編輯子指令,對緩沖區中的文本行進行編輯。重複此工作,直到所有文本行都處理完畢。
sed
指令編輯的是檔案是原始檔案在緩沖區中的副本,并不影響原始檔案,但是可以把編輯結果通過輸出重定向儲存起來。
sed
指令的基本文法如下所示:
常用選項
OPTION
如下表所示:
選項 | 說明 |
---|---|
-n | 取消預設輸出 |
-e script | 允許執行多個腳本 |
-f script-file | 從腳本檔案中讀取指令 |
-i | 直接修改原始檔案 |
-l N | 指定行長度為 N |
-r | 在腳本中使用擴充正規表達式 |
-s | 把檔案作為單獨檔案 |
-u | 最低限度的緩存輸入與輸出 |
文本行定位
sed
指令提供了兩種方式來實作文本行的定位:行号定位、正規表達式定位
行号定位
- 定位某個特定的行
:n
是一個整數,表示定位到文本的第n
行;n
- 定位某段連續的行
:n,m
和n
都是整數,表示定位到起始行為m
,終止行為n
的文本行;m
- 指定起始行和步長
:起始行為start~step
,步長為start
;step
- 第一行
和最後一行1
:$
表示第一行,1
表示最後一行;$
- 指定某行後面的幾行
:表示從第n,+x
行開始到後面的n
行;x
正規表達式定位
sed
指令使用正規表達式定位文本行的文法如下所示:
#regexp 表示正規表達式
/regexp/
sed
指令的常用操作
sed
sed
指令的常用編輯指令有:列印、删除、增加、替換;其基本文法如下所示:
其中
address
稱為位置參數,即上面的行定位;
command
是
sed
所提供的子指令,用來實作編輯操作;
argument
表示子指令的選項參數;
列印文本
sed
指令中可通過位置參數和
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
子指令删除文本行,其文法如下所示:
增加文本
追加文本
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
腳本檔案的格式如下:
sed -f script
awk
指令
awk
awk
指令的基本文法
awk
awk
指令是一個文本處理工具,其基本文法如下所示:
其中,
pattern
表示比對模式,
actions
表示要執行的操作;即對符合
pattern
比對模式的文本行執行
actions
操作;若省略
pattern
比對模式,則表示對所有文本行執行
actions
操作;若省略
pattern
比對模式,則把比對成功的文本行列印輸出;但是不能同時省略
pattern
和
actions
。
pattern
比對模式可以是以下其中一種:
- 正規表達式;
- 關系表達式;
- 模式
,模式1
:指定一行的範圍;2
-
:指定在第一行文本被處理之前所發生的操作;BEGIN
-
:指定在最後一行文本被讀取之後發送的操作;END
actions
指令由一個或多個指令、函數或者表達式組成,他們之間由換行符或分号隔開,并位于大括号内,一般有以下四種情況:
- 變量或數組指派;
- 輸出指令,例如
或printf
;print
- 内置函數;
- 流控制語句,例如
、if
或while
語句;for
awk
指令的執行方式:
- 通過指令行執行:其文法:
awk 'awk程式語句' 資料檔案
- 執行
腳本:其文法:awk
#注意:awk腳本檔案是字尾名為.awk的檔案
awk -f awk腳本檔案 資料檔案
- 可執行腳本檔案:即在
檔案中指定解析器為shell
#! /bin/awk -f
awk
指令的比對模式
awk
在
awk
指令的比對模式主要包括:關系表達式、正規表達式、混合模式、區間模式、
BEGIN
模式、
END
模式等。
關系表達式
awk
指令中的關系運算符如下表所示:
運算符 | 說明 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
~ | 比對運算:例如 表示比對第一個字段以字元 開頭的記錄 |
!~ | 不比對運算 |
正規表達式
awk
支援以正規表達式為比對模式,其基本文法如下所示:
#regexp 表示正規表達式
/regexp/
例如:輸出以字元u開頭的文本行
#! /bin/bash
#filename:test.sh
result=`awk '/^u/ {print}' shell.md`
echo "$result"
#輸出結果:
$ sh test.sh
unset variable_name
unset var
until
until
unset -f 函數名
混合模式
在
awk
指令的比對模式中,可以通過邏輯運算符使用多個表達式組成指令;基本邏輯運算符如下表所示:
運算符 | 說明 |
---|---|
&& | 邏輯與 |
|| | 邏輯或 |
! | 邏輯非 |
區間模式
awk
指令支援區間模式,其文法如下:
pattern1, pattern2
例如:第一個比對模式是:以字元串
one
開頭的文本行;第二個比對模式是:第
3
字段等于
14
的文本行;所有符合這兩個比對模式之間的文本行都會被輸出;
#!/bin/bash
#filename:test.sh
result=`awk '/^one/ , $3==14 {print}' test.txt`
echo "$result"
#執行結果:
$ sh test.sh
one
two
three
four
five
BEGIN
模式
BEGIN
模式是
awk
指令一種特殊的内置模式,在
awk
讀取資料之前對執行的操作;
例如:
#! /usr/bin/awk -f
#filename:test.sh
BEGIN { print "Beging operator." }
/^one/ , $== {print}
#執行結果:
$ ./test.sh test.txt
Beging operator.
one
two
three
four
five
END
模式
END
模式是在處理完資料之後執行的操作;例如:
#! /usr/bin/awk -f
# /usr/bin/env awk -f
#filename:test.sh
BEGIN {
print "Beging operator."
print "===================="
}
/^one/ , $3==14 {print}
END {
print "===================="
print "Ending operator."
}
#執行結果:
$ ./test.sh test.txt
Beging operator.
====================
one 10 20 30
two 15 25 20
three 20 15 31
four 16 26 35
five 11 14 40
====================
Ending operator.
awk
變量
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
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);