這是shell學習系列的第一期,將會不斷更新。。。
具體的學習書籍:Unix shell 編程(第三版)
本節介紹在shell編程中經常用到的一些工具
1、Shell工具----Regex
關於Regex,前面已經有一篇學習筆記描述了大部分常用的應用,文章在這兒
2、Shell工具----cut
cut命令一般用於從資料檔案或者命令的輸出中析取出各種各樣的資料域,一般格式為:
cut –cchars file
chars指定想從檔案的每一行析取那些文字,可以是一個數字,代表每一行的第幾個字元:
cut –c5 data取第五個字元
cut –c5,13,51 data取第五、第13和第51個字元
cut –c20-50 data 取第20到第50之間的字元,包括他們自己
cut –c20- data 取第20個字元到行尾的所有內容,並把結果輸出到標準輸出
上述樣本中的逗號和連字號可以混合使用,達到析取多列欄位的目的
如果 不指定file參數,將從標準輸入讀取資料,意味著該命令可以作為管道過濾器
cut命令的-d和-f選項
當資料用特定的字元分割時,可以用這兩個選項來析取指定的欄位,命令格式為:
cat –ddchar –ffields file
dchar用來指定特定分隔字元,fields用來指定要析取出的欄位的編號(從1開始),可以用逗號和連字號指定多個域,用法和-c選項中的數字指定是相同的
如果上述格式中沒有指定分隔字元,cut就用定位字元作為預設的分隔字元
小技巧:如果事先不知道字元之間是用定位字元還是空格分隔的,可以使用下述命令來觀察,如果是用定位字元分隔的,它會顯式的將定位字元輸出為\t:
sed –n l filename
3、shell工具—paste
paste用來將多行合在一起,與cut的功能差不多相反,一般格式為:
paste files
files之間用空格隔開,files指定的所有檔案中的對應行形成一行,然後寫入標準輸出,可以用破折號(-)表示從標準輸入獲得輸入;
-d選項
預設情況下,形成一行時,不同檔案的行內容之間用定位字元分隔,可以用-d選項來指定分隔字元,如:paste –d'+' names address。
-s選項
使用-s選項告訴paste將同一檔案中的所有行粘到一起,而不是從其他檔案,也可以使用-d選項來指定分隔字元。
4、Shell工具-sed
Sed(stream editor)意即流編輯器,用來編輯資料,命令格式為:
sed command file
其中command是作用於檔案file各行的風格同ed的命令,如果沒有指定檔案,就把標準輸入作為處理對象,命令執行結束後將處理結果寫到標準輸出(不是在原檔案上做修改)。
替換的例子:
sed 's/Unix/UNIX/' intro //將檔案intro中的每一行的第一個Unix替換為UNIX
sed 's/Unix/UNIX/g' intro //通過在s命令的後邊加上全域選項g,保證替換一行中的所有串
注意,sed工具的command都是用單引號括起來的。
-n選項告訴sed除非顯式說明,否則不顯示任何一行,p命令指定顯示那幾行
sed –n '1,2p' intro //只顯示前兩行
sed –n '/UNIX/p' intro //顯示包含UNIX的行
d命令完成刪除整行文字的功能
sed '1,2d' intro //刪除第一行和第二行
sed '/UNIX/d' intro //刪除包含UNIX的所有行
sed預設把輸入的所有行寫入到標準輸出,故上述命令將刪除指定行剩餘的其他行都顯示
其他一些展示sed強大功能的例子:
sed '5d' //顯示第5行
sed '/[Tt]est/d' //顯示包含Text/text的行
sed –n '20,25p' text //顯示第20-25行
sed '1,10s/unix/UNIX/g' intro //在1-10行中將所有unix替換為UNIX
sed '/jan/s/-1/-5/' //將所有包含jan的行中-1替換為-5
sed 's/…//' data //刪除每行的前三個字元
sed 's/…$//' data //刪除每行結尾的3個字元
sed –n 'l' text //顯示text的所有行,把所有不可列印字元顯示為\nn(8進//制值),定位字元顯示為\t(不太懂?求解釋)
shell工具-------tr
tr工具用來轉換來自標準輸入的單個字元,一般格式為:tr from-chars to-chars
其中from-chars和to-chars是一個或多個字元,轉換的結果寫到標準輸出,原檔案保持不變。
cut –d: -f1,6 /etc/passwd |tr : ' '
上述命令首先將passwd檔案中用“:”分隔的第一個和第六個欄位提取出來,然後用tr工具將分隔字元冒號定位點化
-s選項壓縮tochars中連續重複出現的字元
-d選項刪除來自輸入資料流中的指定字元,此時只有一個參數
fromchars和tochars也可以為多個字元,但字元數目要一樣,完成對位的替換,如tr 'a-z' 'A-Z'將所有小寫字母轉換為大寫字母,tr '[A-Z]' '[N-ZA-M]'把A-M替換為N-Z將N-Z替換為A-M
shell工具-------grep
grep命令可以從一個或多個檔案中搜尋特定的字串模式,一般格式為:grep pattern files
執行命令後符合模式pattern的字串的所有行都輸出到標準輸出,如果給grep指定了多個檔案,會在每一行的前面顯示檔案名稱,如果在給定的檔案中沒有符合該模式的字串,則什麼都不輸出。如果不指定輸入檔案,grep將從標準輸入獲得輸入。
最好將模式括在一對單引號中,這樣可以保護其不受shell的幹擾。
-i選項指明在匹配模式時忽略字母的大小寫,模式可以使用Regex。
-v選項輸出指定檔案中不與模式比對的所有行
-l選項 使用該選項時,只輸出包含指定模式的檔案的檔案名稱
-n選項 使用該模式時,不僅輸出與模式比對的行內容,還在每一行前加上該行在檔案中的相對行號
shell工具------sort
預設情況下,sort取出指定檔案中的每一行,將他們按升序排序,特殊字元按照它們的內部編碼排序。
-u選項:在輸出中去除重複的行
-r選項:顛倒排序次序,即按降序排序
-o選項:如果要將排序結果寫入原檔案,用輸出重新導向的話會破壞檔案,-o選項完成這項工作
-n選項:表示把行中的第一個欄位當作數值,按算術方法進行排序
要指定按行中的某個特定欄位排序,可以用+dn選項,d代表阿拉伯數字
sort +1n data //排序時跳過第一個欄位,然後按算術方法排序,將1改為5表示跳過前五個欄位,欄位預設用空格或定位字元進行分隔,如果採用的是其他的分隔字元,使用-t選項指定
-t選項:t後面跟的字元被當作分隔字元
未完待續。。。