天天看點

shell 中 grep、sed、awk 指令grep 指令流編輯器 sedawk指令

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

指令根據不同的參數支援不同的正規表達式:

  • grep

    指令後不跟任何參數(預設),則表示要使用“BRE”;
  • grep

    指令後跟

    -E

    參數,則表示要使用“ERE”;
  • grep

    指令後跟

    -P

    參數,則表示要使用“PCRE”;

常用

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

指令的基本文法如下所示:

常用選項

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

指令的常用編輯指令有:列印、删除、增加、替換;其基本文法如下所示:

其中

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 -f script
           

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

指令的比對模式主要包括:關系表達式、正規表達式、混合模式、區間模式、

BEGIN

模式、

END

模式等。

關系表達式

awk

指令中的關系運算符如下表所示:

運算符 說明
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
~ 比對運算:例如

$1~/^A

表示比對第一個字段以字元

A

開頭的記錄
!~ 不比對運算

正規表達式

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

中的使用者自定義的變量一般在

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);