第四章 shell學習之sed命令和awk編程

來源:互聯網
上載者:User

標籤:shell sed awk

sed命令

sed只是對緩衝區中原始檔案的副本進行編輯,不改變源檔案,所以要儲存則要重新導向到另一個檔案

sed三種方式:

1.sed [選項] ‘sed命令‘ 輸入檔案

2.sed [選項] -f sed指令檔 輸入檔案

3../sed指令檔 輸入檔案

其中3的sed指令檔要以#! bin/sed -f等開頭

選項:

-n 不列印所有行到標準輸出,預設先列印匹配的再列印所有

-e 關聯多個sed命令

-f 調用sed指令檔

定位文本:

x x為指定行號

x,y 從x到y行

/pattern/ 包含模式的行

/pattern/pattern/ 包含兩個模式的行

/pattern/,x 從與pattern的匹配行到x行之間的行

x,/pattern/ 從x行到與pattern匹配的行

x,y! 不包括x和y行號的行

sed編輯命令:

p 列印匹配的行

= 列印行號

a\ 在定位行後追加文本資訊

i\ 在定位行號之前插入文本資訊

d 刪除定位行

c\ 用新文本替換定位文本

s 替換模式

r 從另一個檔案中讀文本

w 將文本寫入一個檔案

y 變換字元

q 第一個模式比對完成後退出

l 顯示控制字元

{} 在定位行執行的一組命令

n 讀取下一個輸入行,用下一個命令處理新的行

h 將模式緩衝區的文本複製到保持緩衝區

H 將模式緩衝區的文本追加到保持緩衝區

x 互換模式緩衝區和保持緩衝區的內容

g 將保持緩衝區的內容複寫到模式緩衝區

G 將保持緩衝區的內容追加到模式緩衝區

例:

1.

sed -n ‘/clc/p‘ clc.txt

在clc.txt中尋找有clc的行並且輸出找到的行,如果沒有-n還會輸出所有內容

2.

sed -n -e ‘/clc/p‘ -e ‘/clc/=‘ clc.txt

或sed -n ‘/clc/{p;=}‘ clc.txt

或sed -n ‘/clc/p ; /clc/=‘

輸出匹配行和行號

3.

cat a.sed

#!/bin/sed -f

/clc\./a\       #如果改為i\則為插入,即在匹配行之情

append a line \

append another line.

chmod u+x a.sed

./a.sed clc.txt

在clc.txt第一個出現clc.的行之後增加兩行

4.

sed -n ‘/clc/,$p‘ clc.txt

列印clc.txt的與clc匹配的行到最後一行

5.

sed -n ‘2,10!p‘ clc.txt

列印不在2~10行之間的行

6.

cat a.sed

#!/bin/sed -f

/[Cc][Ll][Cc]/d

chmod u+x a.sed

./a.sed clc.txt

刪除帶有clc(不管大小寫)的行

7.

sed -n ‘s/clc/CLC/2p‘ clc.txt

替換第二次匹配的clc,替換成CLC,注意sed只會把結果(被替換的行)輸出到標準輸出而不會改變原檔案

在替換模式中,p和-n結合為只列印被替換的行

8.

sed -n ‘s/clc/CLC/w output.txt‘ clc.txt

結果輸出到output.txt,w為將輸出重新導向到檔案,沒有p所有不會列印到螢幕上

9.

sed -n ‘s/clc/(&)/pg‘ clc.txt

全域替換clc為(&),其中&就代表clc

10.

sed -n -e ‘/cl\{3\}c/w output.txt‘ -e ‘/cl\{3\}c/p‘ clc.txt

將匹配clllc的行輸出到output.txt並且輸出到螢幕

11.

sed -n ‘/cl\{3\}c/q‘ clc.txt

匹配第一個clllc然後列印退出

12.

sed ‘y/12345/ABCDE/‘ clc.txt

y為替換,把clc.txt中的1換成A,2換成B,以此類推

13.

sed -n ‘1,$l‘ clc.txt

顯示clc.txt的內容和控制字元,l為顯示控制字元

awk編程

awk的三個階段:

1.讀取檔案前的執行程式碼片段(由BEGIN標識)

2.讀取輸入檔案時的輸入程式碼片段

3.讀輸入檔案完畢之後的執行程式碼片段(由END標識)

awk執行方式:

1.awk  [-F 域分隔字元] ‘awk程式段’輸入檔案

2.awk -f awk指令檔 輸入檔案

3. ./awk指令檔 輸入檔案

注意3方法要在開頭表明awk或gawk路徑,如#! /bin/awk -f或#! /bin/gawk -f

例:

1.awk模式比對

awk由模式和動作構成,模式測試輸入行是否需要執行動作,動作執行輸入行的處理

執行方式1:

[[email protected] tmp]# cat b

[[email protected] tmp]# awk ‘/^$/{print "this is a blank line"}‘ b

this is a blank line

this is a blank line

this is a blank line

this is a blank line

this is a blank line

執行方式2:

[[email protected] tmp]# cat b.awk

/^$/{print "this is a blank line"}

[[email protected] tmp]# awk -f b.awk b

this is a blank line

this is a blank line

this is a blank line

this is a blank line

this is a blank line

執行方式3:

[[email protected] tmp]# which awk

/bin/awk

[[email protected] tmp]# cat b.awk 

#! /bin/awk -f

/^$/{print "this is a blank line"}

[[email protected] tmp]# chmod u+x b.awk 

[[email protected] tmp]# ./b.awk b

this is a blank line

this is a blank line

this is a blank line

this is a blank line

this is a blank line

2.記錄和域

檔案由記錄組成,記錄由域組成,預設一行一條記錄,空格或者定位字元分割域

[[email protected] tmp]# cat tel

clc,1,234325

clc1,8,258353

clc3,3,234583

clc4,2,345534

[[email protected] tmp]# awk ‘BEGIN{FS=",";one=1;two=2} {print $1 " " $(one+two)}‘ tel

clc 234325

clc1 258353

clc3 234583

clc4 345534

3.關係和布爾運算

$0代表正在處理的記錄,$1,$2...代表該記錄的域的編號,~為匹配Regex,!~為不匹配Regex(Regex要在//內)

[[email protected] tmp]# awk ‘BEGIN{FS=":"} {if($3>=500 && $0!~/nologin/) print $0}‘ /etc/passwd

clc:x:500:500:clc:/home/clc3:/bin/bash

clc3:x:501:502::/home/clc3:/bin/bash

clc2:x:502:501::/home/clc2:/bin/bash

4.運算式

+,-,*,/,%(模運算),^或**(乘方),++x,x++

[[email protected] tmp]# cat b

[[email protected] tmp]# awk ‘/^$/{print x++}‘ b

0

1

2

3

4

[[email protected] tmp]# awk ‘/^$/{print ++x}‘ b

1

2

3

4

5

5.系統變數

$n 第n個域,域由FS分割

$0 記錄所有的域,即當前處理的記錄

ARGC 命令列參數的數量(命令本身為參數1)

ARGV 命令列參數數組

ARGIND 命令列中當前檔案的位置(以0開始)

CONVFMT 數字轉換格式

ENVIRON 環境變數關聯陣列

ERRNO 最後一個系統錯誤的描述

FILENAME 當前檔案名稱

FS 欄位分割符

RS 記錄分隔字元

OFS 輸出域分隔字元,預設為空白格

ORS 輸出記錄分隔字元,預設為換行

IGNORECASE 布爾變數,為真則忽略大小寫

NF 目前記錄的域數量

NR 目前記錄數

例1:

[[email protected] tmp]# awk ‘BEGIN{FS=",";OFS=";";ORS="|"} {print NR,NF,$0,"\n"}‘ tel

1;3;clc,1,234325;

|2;3;clc1,8,258353;

|3;3;clc3,3,234583;

|4;3;clc4,2,345534;

例2:

[[email protected] tmp]# cat a4.awk 

#! /bin/awk -f

BEGIN{

for(i in ENVIRON)

{print i"="ENVIRON[i];};

}

[[email protected] tmp]# ./a4.awk 

TERM=xterm

G_BROKEN_FILENAMES=1

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-AQhrDkEqnE,guid=9fcb974e6fd4a8e074366f00509e212a

GNOME_DESKTOP_SESSION_ID=Default

SHLVL=2

PWD=/tmp

DESKTOP_SESSION=default

PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

...

6.格式化輸出

printf修飾符:

- 靠左對齊

width 域的步長

.prec 小數點右邊的位元

printf格式符:

%c ascii字元

%d 整數型

%e 浮點數,科學計數法

%f 浮點數

%o 八位元

%s 字串

%x 十六進位數

[[email protected] tmp]# cat tel

clc,1,234325

clc1,8,258353

clc3,3,234583

clc4,2,345534

[[email protected] tmp]# awk ‘BEGIN{FS=","} {printf("%5.2f\t%5s\t%-5d\n",$2,$1,$3)}‘ tel

 1.00     clc   234325

 8.00    clc1   258353

 3.00    clc3   234583

 2.00    clc4   345534

7.內建字串函數

gsub(r,s) 在輸入檔案中用s替換r,r為/Regex/或者"被替換內容",s為"替換內容"

gsub(r,s,t)  r在t指定的記錄中匹配,比如t為$1

index(s,t) 返回s中字串第一個t的位置

length(s) 返回s的長度

match(s,t) 測試s是否包含匹配t的字串,不成功返回0,否則返回離s頭部的距離

split(r,s,t) 以t為分隔字元分割r,結果存入s數組中,返回分割後的記錄數

sub(r,s,t) 將t中第一次出現的r替換為s

substr(r,s) 返回字串r中從位置s開始的尾碼部分

substr(r,s,t) 返回字串r中從位置s開始長度為t的尾碼部分

例:

[[email protected] tmp]# cat a

clc

clllc

cc

abc

cabcc

[[email protected] tmp]# awk ‘gsub(/cl+c/,"kkk") {print $0}‘ a

kkk

kkk

[[email protected] tmp]# awk ‘{gsub(/cl+c/,"kkk");print $0}‘ a

kkk

kkk

cc

abc

cabcc

注意grub在{}和不在{}的區別

[[email protected] tmp]# awk ‘BEGIN{str="hello world";print substr(str,3,6)}‘

llo wo

8.傳遞參數

[[email protected] tmp]# cat tel

clc,1,234325

clc1,8,258353

clc3,3,234583

clc4,2,345534

[[email protected] tmp]# cat a.awk 

#! /bin/awk -f

NF!=MAX

{print("the line "NR" does no have "MAX" filds")}

或者:

[[email protected] tmp]# cat a.awk 

#! /bin/awk -f

{print $0;if (NF!=MAX) {print("the line "NR" does no have "MAX" filds")}}

[[email protected] tmp]# ./a.awk MAX=2 FS="," tel

clc,1,234325

the line 1 does no have 2 filds

clc1,8,258353

the line 2 does no have 2 filds

clc3,3,234583

the line 3 does no have 2 filds

clc4,2,345534

the line 4 does no have 2 filds

9.條件和迴圈語句

if else

如:if(x~/[Hh]el?o/) print x

while

do while

for

例:

[[email protected] tmp]# cat a2.awk 

#! /bin/awk -f

BEGIN{

for(i=0;i<ARGC;i++)

{

printf("arg%d is %s\n",i,ARGV[i]);

};

printf("there are %d arg\n",ARGC);

}

[[email protected] tmp]# ./a2.awk a1 a2 a3

arg0 is awk

arg1 is a1

arg2 is a2

arg3 is a3

there are 4 arg

10.數組

array[索引]=值

for(索引 in array)

例1:

[[email protected] tmp]# cat a1.awk 

#! /bin/awk -f

BEGIN{

str="str1/str2/str3";

print split(str,result,"/");

for(fild in result)

{

print result[fild];

}

}

例2:

[[email protected] tmp]# cat a3.awk 

#! /bin/awk -f

BEGIN{

FS=",";

if(ARGC>2)

{

name=ARGV[1];

delete ARGV[1];

}

else

{

 while(!name)

 {

   print "please enter a name:";

   getline name< "-";   #從標準輸入中讀取

 }

};

}

{

if($1~name)

{print $1,$3;};

}

[[email protected] tmp]# cat tel

clc,1,234325

clc1,8,258353

clc3,3,234583

clc4,2,345534

abc,5,2343243

[[email protected] tmp]# ./a3.awk abc tel

abc 2343243

[[email protected] tmp]# ./a3.awk tel

please enter a name:

abc

abc 2343243


本文出自 “flyclc” 部落格,請務必保留此出處http://flyclc.blog.51cto.com/1385758/1540162

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.