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