SHELL腳本擴展

使用SED命令git

sed稱爲流編輯器,命令格式以下:正則表達式

sed option script file
-e script   #指定多個命令
-f script_file   #指定命令文件
-n  #不須要爲每一個命令產生輸出

1)s替換命令:使用第二個文本字符串替換第一個兩個斜杆之間指定的文本數組

sed 's/dog/cat/' data1  #在data1之中使用cat替換dogbash

sed -e 's/dog/cat/; s/brown/green/' data1  #在data1之中執行兩個替換,注意兩個s命令之間須要使用分號隔開編輯器

複製代碼
#s命令默認只能替換每行首次匹配字符
#可使用替換標記來進行靈活設置
s/pattern/replacement/flags
#flags取值以下:
數字:表示替換第幾個匹配到得關鍵字
g:表示替換全部匹配的字符串(不只僅每行第一個)
p:打印原始行的字符串
w:將替換的結果寫入到文件之中
複製代碼
sed 's/dog/cat/2' data1  #替換每行的第二次匹配的模式
sed 's/dog/cat/g' data1  #替換每行全部匹配的模式
sed -n 's/dog/cat/p' data1  #-n選項禁止編輯器輸出,p選項輸出修改的行,兩者結合結果就是隻輸出修改後的行
sed 's/dog/cat/w test' data1   #將輸出寫入到文件test之中

 字符串標記!在兩個!之間表示一個字符串,該符號可用於替換斜杆/, 函數

sed 's!/bin/bash!/bin/csh!' data1   #使用/bin/csh替換/bin/bashpost

sed 's!dog!cat!' data1  #使用cat替換dogui

2)使用地址spa

[address]command命令行

或者多命令着方式

[address]{

  command

  command .....

}

sed '2s/dog/cat/' data1     #修改第二行
sed '2,3s/dog/cat/' data1  #修改2,3行 
sed '2,$s/dog/cat/'  data1 #修改2~末尾行

3)使用文本模式篩選器

/pattern/command   #只有匹配pattern的行纔會執行command命令

4)其餘命令

複製代碼
d:刪除行
i:插入命令
a: 附加命令
y:變換命令
=:打印行號
l: 列出行
w: 寫文件
r: 讀文件
複製代碼

[address]y/inchars/outchars/ #將inchars中得字符與outchars一一對應進行變換
sed 'y/123/789/' data1 #將1-7,2-8,3-9方式進行替換

 

 使用正則表達式
 

一、^字符放在模式的開頭:表示開頭匹配(放在其餘位置沒有做用)

  sed -n '/^Two/p' data3  #以Two開頭的模式匹配

二、$字符放在模式的結尾:表示結尾匹配(放在其餘位置沒有做用)

  sed -n '/text$/p' data3  #以text結尾的模式匹配

  sed -n '/^One line of test text$/p' data3  #聯合匹配

  sed '/^$/d' data3   #使用^$匹配空行,而且使用d命令刪除空行

 三、.字符,匹配除換行符外的單個字符,而且必需要有一個字符

  sed -n '/dog\..5/p' data1  #匹配dog.[]5 其中一個點使用了轉義

四、字符類

  [abc]  #匹配abc中得任意一個字符

  [0-9]  #匹配範圍 0~9 之間的任意一個字符

  [a-z]   #匹配字母

  sed -n '/^[0-9][0-9][0-9]$/p'  #匹配3位數值型,注意^$的使用

複製代碼
特殊字符類
[[:alpha:]]  #匹配字母(大小寫)
[[:alnum:]]  #任意字母或者數值
[[:blank:]]  #空格或者製表符
[[:digit:]]    #數值
[[:lower:]]  #小寫字母
[[:upper:]]  #大寫字母
[[:print:]]   #可打印字符
[[:punct:]]   #標點符號
[[:space:]]  #空白字符
複製代碼

五、星號:在某個字符後使用,表示該字符必須在匹配的文本中不出現或者出現屢次。聯合使用點號 .* 表示匹配任意字符一次或者屢次。

六、問號:前面的字符不出現或者只出現一次

  echo "bet" | gawk '/b[ae]?t/{print $0}'   #問號與字符類聯合使用表示字符類不出現或者只出現一次

七、加號:表示以前的模式出現一次或者屢次,至少一次

八、大括號:表示以前的模式出現指定次數

  m: 表示出現m此

  m,n: 表示出現m~n次之間  

  echo "bet" | gawk '/b[ae]{1,2}t/{print $0}'  #表示[ae]出現1~2次

 九、管道:表示鏈接的多個模式只要一個匹配便可經過

  echo "The cat is asleep" | gawk '/cat|dog/{print $0}'   #匹配cat或者dog

 十、使用括號將表達式分組,分組後就能夠將其做爲一個模式,與星號、問號等聯合使用

  echo "Saturday" | gawk '/Sat(urday){1}/{print $0}'

 

 使用gawk
 

一、命令格式

gawk options program file
-F fs  #指定數據字段分隔符
-f script_file #指定腳本命令文件
-v var=value  #定義變量與默認值
#其中的program命令以大括號方式給出

二、print命令

echo "" | gawk '{print "Hello"}'

三、數據字段

  gawk命令自動將每行文本使用分隔符進行分割,而後能夠引用這些字段

  $0  整行文本

  $1  第一個字段,依次類推

echo "My name is Rich" | gawk '{$4="Zcs"; print $0}'
#將第四個字段修改爲zcs,而後打印,注意多個命令之間使用分號分隔。

gawk -F: script2 /etc/passwd  #使用F指定分隔符
#也能夠在腳本內部使用FS變量指定分隔符

四、BEGIN與END命令模塊

  分別用於指定在執行命令腳本前執行與以後執行。

echo "My name is Rich" | gawk 'BEGIN {print "Hello World"} {$4="Zcs"; print $0} END {print "END"}'   #分別指定了BEGIN與END命令塊

五、內置變量

複製代碼
FIELDWIDTHS:採用固定長度做爲分割字段依據,此時FS無效
FS:輸入字段分割符號
OFS:輸出字段分割符號(在print中使用)
RS,ORS :用於設置輸入行的分割方式(FS爲行內部,RS爲行之間)
gawk 'BEGIN{FS=" ";OFS="-"} {print $1,$2,$3,$4}' data1 #設置了OFS爲橫線
gawk 'BEGIN{FS=" ";OFS="-";FIELDWIDTHS="5 5 5 5"} {print $1,$2,$3,$4}' data1  #設置了FIELDWIDTHS後,FS無效,而且使用其做爲分割字段依據

ARGC,ARGV:分別表示gawk運行時參數個數,與參數數組,從0開始索引,該參數是調用gawk時的參數,索引位置0表示爲gawk,命令部分不算,以下:
gawk 'BEGIN{print ARGC,ARGV[1]}' data1  #2 data1

ENVIRON以關聯數組方式檢索環境變量  
ENVIRON["HOME"]

NF:表示每行分割出來的最後一個字段索引,使用$NF來引用最後一個字段
gawk 'BEGIN{FS=":";OFS=":"} {print $1,$NF}' /etc/passwd

FNR、NR:前者表示當前輸入文件已處理記錄數,處理完一個輸入文件時該值被重置,NR表示當前總的處理記錄數
gawk 'BEGIN{FS=" "} {print $1,"FNR="FNR,"NR="NR}' data1 data1
複製代碼

六、使用自定義變量

  gawk容許使用-v在命令行中設置自定義變量,另外在BEGIN模塊中也能夠自定義變量,格式都爲var=value

  特別須要注意的是,在gawk內部引用不變量不須要加美圓符號。

gawk -v val=2 '{print val}' data1
注意:在gawk之中變量的引用不須要使用$符號,只在引用被分割的字段時須要使用。

七、使用數組

  gawk內部數組採用關聯數組方式,相似map,須要使用關鍵字來引用。

  可使用for循環遍歷(可是不保證每次遍歷以一樣順序),可使用delete來輸出項。

複製代碼
gawk 'BEGIN{
    var["a"]=1
    var["b"]=2
    for(test in var)  #使用for循環遍歷數組
    {
        print "Index:",test," - value:",var[test]
    }
    delete var["b"]  #輸出關鍵字b
    print "----"
    for(test in var)
    {
        print "Index:",test," - value:",var[test]
    }
}'

#output
Index: a  - value: 1
Index: b  - value: 2
----
Index: a  - value: 1
複製代碼

八、模式匹配

  1)在大括號(命令)前使用雙斜線做爲正則表達式來匹配

gawk '/dog/{print $0}' data1

  2)使用模式操做符~加上正則表達式來進行匹配

gawk '$2 ~ /^quick/{print $0}' data1  #表示第二個字段須要匹配/^quick/

  3)使用數學表達式匹配

gawk -F: '$4 == 0{print $1}' /etc/passwd  #精確匹配第四個字段等於零

九、結構化語句

  1)if語句

gawk '{if ($10 > 1) print $0}' data1
gawk '{if ($10 > 1) print $0; else print "hahahah"}' data1
#若if語句中有多條命令須要使用大括號包圍住。

  2)循環語句

複製代碼
#以下腳本統計輸入文件中以空格分隔的多個數值的和

inputFile=$1
gawk 'BEGIN{total=0;lineTotal=0} {
i=1
lineTotal=0
print $0,NF
while (i <= NF) {   #使用NF內部變量來獲取每行分隔的字段數
    lineTotal += $i
    i = i+1
}
print $0,"total:",lineTotal
total = total + lineTotal
}
END{print "total is ",total}' $inputFile

#同時while語句還支持break、continue關鍵字
do
{
    statements
} while (condition)
與while在條件判斷上有區別,循環中得語句至少運行一次

for ( i=1; i<10; i++)
{
    statements
}
複製代碼

十、格式化輸出 printf 命令

十一、gawk還提供了數學函數、字符串函數、時間計算函數,還能夠自定義函數

相關文章
相關標籤/搜索