正則表達式、linux文件處理三劍客:grep、sed、awk

基本的正則表達式元字符:默認工作于貪婪模式;

字符匹配:

.:匹配任意單個字符;

[]:匹配指定范圍內的任意單個字符;

[^]:匹配范圍外的任意單個字符;

[:digit:]數字、[:lower:]小寫字母、[:upper:]大寫字母、[:alpha:]所有字母、[:space:]空白符、[:alnum:]字母數字、[:punct:]標點符號

匹配次數:

*:匹配前面的字符任意次;

.*:任意長度的任意字符;

\?:匹配前面的字符0-1次;即前面的字符可有可無;

\+:匹配前面的字符至少1次;

\{m\}:匹配前面的字符m次;

\{m,n\}:匹配前面的字符m到n次;

位置錨定:

^:行首錨定

$:行尾錨定

^pattern$:用于模式匹配整行;

\<或\b:詞首錨定;用于單詞模式的左側;

\>或\b:詞尾錨定;用于單詞模式的右側;

\<pattern\>:匹配整個單詞;

分組:

\(pattern\):將括號內的作為整體來匹配;

注意:分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為:\1,\2,\3,…

\1:從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;

向后引用:引用前面分組括號中的模式所匹配字符,(而非模式本身);

 

擴展的正則表達式元字符:默認工作于貪婪模式;

字符匹配:

.:匹配任意單個字符;

[]:匹配指定范圍內的任意單個字符;

[^]:匹配范圍外的任意單個字符;

[:digit:]數字、[:lower:]小寫字母、[:upper:]大寫字母、[:alpha:]所有字母、[:space:]空白符、[:alnum:]字母數字、[:punct:]標點符號

匹配次數:

*:匹配前面的字符任意次;

.*:任意長度的任意字符;

?:匹配前面的字符0-1次;即前面的字符可有可無;

+:匹配前面的字符至少1次;

{m}:匹配前面的字符m次;

{m,n}:匹配前面的字符m到n次;

位置錨定:

^:行首錨定

$:行尾錨定

^pattern$:用于模式匹配整行;

\<或\b:詞首錨定;用于單詞模式的左側;

\>或\b:詞尾錨定;用于單詞模式的右側;

\<pattern\>:匹配整個單詞;

分組:

(pattern):將括號內的作為整體來匹配;

或者:

a|b:整個左側或者整個右側;

linux文本處理三劍客:grep、sed、awk

grep,egrep,fgrep:文本過濾工具:pattern;

grep [options] pattern [file…]

常用選項:

–color=auto:對匹配到的文本著色顯示;

-v:顯示不能夠被pattern匹配到的行;

-i:忽略大小寫;

-o:僅顯示匹配到的字符串本身;

-q:靜默模式

-A #:顯示匹配到的行及以后#行;

-B #:顯示匹配到的行及行前#行;

-C #:顯示匹配到的行及前后各#行;

-E:支持擴展正則表達式匹配

 

 

sed:行編輯器:模式空間、保持空間;

sed:文本流的行編輯器;

用法:

sed ? [OPTION]… ? ‘script’ ? input-file…

script:’地址命令’

常用選項:

-n:不輸出模式空間中的內容至屏幕;

-e:多點編輯;

-f /path/to/script_file:從指定文件中讀取編輯腳本;

-r:使用擴展正則表達式;默認使用基本正則表達式;

-i:修改源文件

 

地址定界:

(1)不給地址:對全文進行處理;

(2)單地址:#:指定的行;/pattern/:被此處模式所匹配到的每一行;

(3)地址范圍:

#,#

#,+#

/pat1/,/pat2/

#,/pat1/

(4)~:步進

1~2:所有奇數行

2~2:所有偶數行

 

編輯命令:

d:刪除;

p:顯示當前模式空間中的內容;

a \text:在行后面追加文本,支持使用\n多行追加;

i \text:在行前面插入文本,支持使用\n多行追加;

c \text:替換行為單位或多行文本;

w /path/to/somewhere:保存模式空間中匹配到的行到指定文件中;

r /path/to/somewhere:讀取指定文件的文本流至模式空間中匹配到的行的行后;

=:為模式空間中的行打印行號;

!:取反條件;對地址定界條件取反;

s ///:查找替換;支持使用其他分隔符:s@@@,s###;

替換標記:g:行內全面替換;默認只替換首個;

可以使用&后項引用;例如?# sed ‘s@r..t@&er@’ /etc/passwd

也可以使用分組引用;例如?# sed ‘s@\(r..t\)@\1er@’ /etc/passwd

 

高級編輯命令:保持空間hold space;

h:把模式空間中的內容覆蓋至保持空間中;

H:把模式空間中的內容追加至保持空間中;

g:從保持空間中取出數據覆蓋至模式空間;

G:從保持空間中取出數據追加至模式空間;

x:把模式空間中的內容與保持空間的內容互換;

n:讀取匹配到的行的下一行至模式空間;

N:追加匹配到的行的下一行至模式空間;

d:刪除模式空間的行

D:刪除多行模式空間中的所有行;

例子:

sed -n ‘n;p’ file:顯示偶數行;

sed ‘1!G;h;$!d’ file:逆序顯示;

sed ‘$!N;$!D’ file:取出文件后兩行

sed ‘$!d’ file:取出文件最后一行

sed ‘G’ file:每一行后加一個空白行

sed ‘/^$/d;G’:刪除多行空白行且每行后增加一個空白行

sed ‘n;d’ file:顯示奇數行

sed -n ‘1!G;h;$p’ file:逆序顯示

 

 

awk:報告生成工具,格式化文本輸出;注意:變量引用,無需加$

基本用法:gawk ? ?[options] ? ?‘program’ ? ? FILE ? ?…

program:pattern{action statements}:語句之間用分號分隔。

options:常用選項

-F:指明輸入時用到的字段分隔符;

-v var=value:自定義變量;

 

輸出命令:

1、print ? ?item1,item2,…:

要點:(1)、逗號分隔

(2)輸出的各item可以是字符,也可以是數值:當前記錄的字段、變量

(3)如省略item,相當于print $0;

 

2、變量:

內建變量:

FS:輸入字段分隔符;默認為空白字符

OFS:輸出字段分隔符;默認為空白字符

RS:輸入時的換行符

ORS:輸出時的換行符

{print NF}、{print $NF}

NF:字段數量

$NF:最后一個字段

NR:逐行顯示行數

FNR:各文件分別計數:逐行顯示行數

FILENAME:逐行顯示文件名

ARGC:命令行參數的個數

ARGV:數組,保存的是命令行所給定的各參數

 

自定義變量:變量名區分字符大小寫;

(1)-v var=value

(2)在program中直接定義

 

3、printf命令

格式化輸出:printf ? ?FORMAT, item1, item2, …

要點:(1)FORMAT必須給出;

(2)不會自動換行,需要顯示給出換行控制符,\n;

(3)FORMAT中需要分別為后面的每個item指定一個格式化符號;

格式符:

%c:顯示字符的ASCII碼;

%d,%i:顯示十進制整數;

%e,%E:科學計數法數值顯示;

%f:顯示為浮點數;

%g,%G:以科學計數法或浮點形式顯示數值;

%s:顯示字符串;

%u:無符號整數;

%%:顯示%自身;

示例:# awk -F: ‘{printf “UNAME:%s,UID:%d\n”,$1,$3}’ /etc/passwd

修飾符:

#[.#]:第一個#控制顯示的寬度,第二個#表示小數點后的精度;默認右對齊

-:左對齊

+:顯示數值的符號

 

4、操作符:

算術操作符:x+y、x-y、x*y、x/y、x^y、x%y、-x、+x

字符串操作符:默認沒有符號的操作符,字符串連接

賦值操作符:=,+=,-=,*=,/=,%=,^=,++,–

比較操作符:>,>=,<,<=,!=,==

模式匹配符:~:是否匹配,!~:是否不匹配

邏輯操作符:&&,||,!

函數調用:function_name(argu1,argu2,…)

條件表達式:

selector?if-true-expression:if-false-expression

示例:

# awk -F: ‘{$3>=1000?utype=”admin”:utype=”comm”;printf “%20s:%s\n”,$1,utype}’ /etc/passwd

 

5、PATTERN

(1)空模式:匹配每一行;

(2)/regular expression/:僅處理能夠被此處模式匹配到的行;

(3)relational expression:關系表達式;結果有真有假;結果為真的才會處理;

真:結果為非0值,非空字符串;

示例:# awk -F: ‘$3>=1000{print $1,$3}’ /etc/passwd

(4)地址定界:

起始行,結束行:/pat1/,/pat2/:注意:不支持直接給出數字的格式

(5)BEGIN/END模式

BEGIN{}:僅在開始處理文件的每一行文本之前執行一次;

END{}:僅在文本處理完成之后命令執行之前執行一次;

 

6、常用action

(1)expression表達式

(2)control statements控制語句:if,while等;

(3)組合語句:

(4)輸入語句

(5)輸出語句

 

7、控制語句

if(condition) ? ? {statements}:單分支

if(condition) ? ? {statements} ? ?else? ? {statements}:多分支

使用場景:對awk取得的整行或者某個字段做條件判斷;

例子:

# awk -F: ‘{if ($3>=1000) {printf “cuser: %s\n”,$1} else {printf “suser: %s\n”,$1}}’ /etc/passwd

# awk -F: ‘{if ($NF==”/bin/bash”) {print $1,$NF}}’ /etc/passwd

 

while(condition) ? ? {statements}:

使用場景:對一行內的字段逐一類似處理時使用;對數組中的各元素逐一處理時使用;

# awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i);i++}}’ /etc/grub2.cfg

 

do ? ?{statements} ??while(condition):意義:至少執行一次循環

 

for(expr1;expr2;expr3)? {statements}:

例子:

# awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg

特殊用法:能夠遍歷數組中的元素:

語法:for(var in array) {for-body}

 

switch語句:多分支if語法

switch(expression) ? {case value1 or /REGEXP/: ? statement; ?case value2 or /REGEXP/: ? statement; …;default: statement}

 

continue:提前結束第n層的本輪循環,而直接進入下一輪判斷;

break [n]:提前結束循環;

next:提前結束本行的處理而直接進入下一行:

例子:

# awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd :顯示偶數行;

 

delete array[index]

delete array

exit

{ ? ?statements ? }

 

8、awk中的array數組

array[index-expression]

index-expression:

(1)可使用任意字符串;字符串要使用雙引號;

(2)如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”;

若要判斷數組中是否存在某元素,要使用“index in array”格式進行;

若要遍歷數組中的每個元素,要使用for循環;

語法:for(var in array) {for-body}:注意var會遍歷array的每個索引;

例子:

# awk ‘BEGIN{wd[“1″]=”mday”;wd[“2″]=”tday”;for(i in wd) {print wd[i]}}’

# netstat -tan | awk ‘/^tcp\>/{state[$NF]++}END{for(i in state) {print i,state[i]}}’
LISTEN 6
ESTABLISHED 1

例子:統計某文本每個字段出現的次數;

# awk ‘{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}’ /var/log/secure

 

9、函數

常用內置函數:

數值處理:

rand():返回0和1之間一個隨機數;

字符串處理:

length([s]):返回指定字符串的長度;

sub(r,s,[t]):以r表示的模式來查找t所表示的字符串中的匹配的內容,并將其第一次出現替換為s所表示的內容;

gsub:同上,表示全局替換;

split(s,a[,r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中;

例子:

# netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}END{for(i in count){print i,count[i]}}’

# netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);for(i in ip){print ip[i]}}’

 

 

 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/93414

(0)
N26-深圳-城市蝸牛N26-深圳-城市蝸牛
上一篇 2018-03-27
下一篇 2018-03-28

相關推薦

  • 課堂筆記(6)

    筆記

    Linux筆記 2018-04-08
  • 關于grep 與 正則表達式的那些事

    首先要記住的是: 正則表達式與通配符不一樣,它們表示的含義并不相同! 正則表達式只是一種表示法,只要工具支持這種表示法, 那么該工具就可以處理正則表達式的字符串。vim、grep、awk 、sed 都支持正則表達式,也正是因為由于它們支持正則,才顯 得它們強大grep (縮寫來自Globally search a Regular Expression and…

    Linux筆記 2018-04-08
  • 正則表達式詳細用法

    grep命令: 文本過濾(按行過濾) 參數 ? ? ? ? ? ? ? ? -v 取反 ? ? ? ? ? ? ? ? -i 忽略大小寫 ? ? ? ? ? ? ? ? -n 顯示行號 ? ? ? ? ? ? ? ? -c 統計匹配行數 ? ? ? ? ? ? ? ? -q 靜默執行(不顯示執行結果) ? ? ? ? ? ? ? ? -o 僅顯示搜索到的字符…

    Linux筆記 2018-04-08
  • Shell 腳本的進階

    if case

    2018-05-07
  • systemd及awk簡介

    systemd及awk簡介

    Linux筆記 2018-04-20
  • 加密和安全

    安全機制 信息安全防護的目標保密性 Confidentiality完整性 lntegrity可用性 Usability可控制性Controlability不可否認性 Non-repudiation安全防護環節物理安全:各種設備/主機、機房環境系統安全:主機或設備的操作系統應用安全:各種網絡服務、應用程序網絡安全:對網絡訪問的控制、防火墻規則數據安全:信息的備…

    2018-06-02
欧美性久久久久