1. 程式人生 > >shell 程式設計3 正則表示式

shell 程式設計3 正則表示式

1 正則表示式和萬用字元:

  1. 正則表示式用來在檔案中匹配符合條件的字串,正則是包含匹配。 grep、awk、sed等命令可以支援正則表示式。

  2. 萬用字元用來匹配符合條件的檔名,萬用字元是完全匹配。ls、find、cp這些命令不支援正則表示式,所以只能使用shell自己的萬用字元來進行匹配了。

2 萬用字元介紹:

  1. * 用來匹配任意內容
  2. ?用來匹配任意一個字元(有且只有一個字元)
  3. [] 匹配括號內的一個字元

3.正則表示式

元字元:

* 元字元詳解:

假設檔案a.txt 有為一下內容:
a
aa
aaa
aaaa
aaaaa

b
bb
bbb
bbbb
bbbbb

當我們使用命令 grep . a* 是,此時會將所有的字元都輸出,因為* 匹配前面表示式0個或多個,所以都可以匹配

3 字串擷取命令

cut : 對列進行擷取,grep 對行進行擷取

cut是列提取命令,預設用的分隔符是Tab鍵,要指定分隔符用-d選項 當擷取比較規律的文件,如有“:”或有Tab製表符時,用cut擷取比較方便 #cut [選項] 檔名 選項(選項沒有先後順序):

-f 列號:提取第幾列(如果要提取幾列,則用“,”將列號隔開)

-d 分隔符:按照指定分隔符分隔列

注意:如果制定分隔符為一個空格,cut命令只會以一個空格為分隔符,而不會以多個空格為分割符。

printf 命令:

可以執行輸出操作,printf 字串格式  輸出內容 

輸出型別:

%ns 代表字串 n表示輸出幾個字串
%ni 輸出整數, n表示輸出幾個數字
%n.mf 輸出小數, n表示有輸出n位,有m位小數

示例:
printf "this num is %i" 123

printf "this str is %s" 'str'

printf "this float is %8.2f" 123222.3333

輸出轉義字元時,用雙引號括起。

awk命令:

awk  '條件1{動作1}   條件2{動作2}...'   檔名,條件滿足時,執行動作

操作文字:
student.txt:

ID	Name	gender	Mark
1	1	1	1
2	2	2	2
3	3	3	3

獲取第一列和第三列:
awk '{printf $2 "\t" $4 "\n"}' student.txt  

$1表示第一列,$0表示所有的列

檢視記憶體:df -h |awk '{printf $1 "\t" $4 "\n"}'

條件表達時:
BEGIN:在讀取之前的操作,可以指定分隔符,使用FS內建變數設定
END:在讀取玩之後的操作

示例:
awk 'BEGIN{FS=":"}{printf $1 "\n"}' /etc/passwd  //輸出所有使用者

cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"} {printf $1 "\t" $3 "\n"}'

sed: sed命令是用來進行檔案內容修改的。

格式:sed 選項 '動作‘ 檔名

選項:

-n :將處理的行列印到螢幕
-e :允許多條sed命令
-i :修改原始檔

動作:

a 追加
c 行替換
i 插入
p 列印
s 字元替換,格式為 “行範圍s/就字元/新字元/g”

示例:

sed -n '2p' student.student //顯示第二行

sed '2a haha' student.txt //在第二行追加haha

sed '2i haha' student.txt //在第二行前插入

sed '2c haha' student.txt //替換第二行

sed '3s/2/haha/g' student.txt   //將第三行的所有 2 替換為haha

sed -e 's/2/haha/g;s/1/ha/g' student.txt  替換第一行的字元和第二行的字元

sort :

排序命令:可以對文字進行排序,以行顯示。

選項:

-f : 忽略大小寫
-n : 以數字大小統計,預設以字元排序
-r : 反向排序 
-t : 指定分隔符
-k : 第幾個字元進行排序,與-t 混合使用

示例:

sort /ect/passwd //預設排序
sort -n -t ":" -k 3 /etc/passwd // 以: 為分隔符,以第三個分割的字元進行數字排序

wc : 用來統計行數 , 單詞數,字元數。