1. 程式人生 > >shell腳本學習進階和正則表達示的應用

shell腳本學習進階和正則表達示的應用

exec delete width 處理 append 轉義 標簽 image 查找

Sort 排序:

-f:     忽略字符大小寫
-n:    比較數值大小
-t:    指定分隔符
-k:    指定分隔後進行比較字段序號
-u:    重復的行,只顯示一次

 技術分享圖片

按第二行數值排序:

$ sort -k2n sort.txt
ccc 8
aaa 11
yyy 12
eee 22

重復行顯示一次:sort -u sort.txt

uniq 處理重復行,與sort配合使用:

技術分享圖片

wc命令:

行 | 字符 | 單詞
$ wc sort.txt
 6 12 41 sort.txt
$ wc -l sort.txt 
6 sort.txt
$ wc -c sort.txt 
41 sort.txt
$ wc -w sort.txt 
12 sort.txt

  

find命令:

按名字查找
$ find ./ -name "*.sh"
查找當前一級目錄下的普通文件
$ find ./ -maxdepth 1 -type f
查找大小在1M到5M之間的 
$ find ~ -size +1M -size -5M
查找log目錄10天之前創建的文件
$ find ~/log -ctime +10
查找log目錄5天內創建的文件
$ find ~/log -ctime -5

  

ls命令不能讀管道或者標準輸入,可以使用 exec代替:

find ~/log -ctime +10 -exec ls -la {} \;

  

使用ok選項更安全,會要求確認:

find ~/log -ctime +10 -ok rm - f {} \;

  

當然了,還可以使用 xargs 將前一個命令的輸出結果,分成小塊解析:

find ./ -maxdepth 1 -type -f | xargs ls -l

  

grep命令可以進行內容的查找:

-r  遞歸子目錄

-i  忽略大小寫

-v  排除

正則表達示:

字符類:

技術分享圖片

數量限定:

技術分享圖片

位置限定符:

技術分享圖片

特殊字符:

技術分享圖片

可以使用egrep命令,支持擴展的正則表達示:

例子1:匹配出所有IP地址 XXX.XXX.XXX.XXX

egrep ‘^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$‘ all.txt

例子2:匹配郵箱 [email protected]|CN

egrep ‘ [0-9a-zA-Z]+@[0-9a-zA-z]+\.(com|cn)$‘ all.txt

  註意:目前分為基礎正則和擴展正則,基礎正則不支持 ?+ { } | ().

如果想支持,需要轉義字符,寫的定要先寫擴展正則,在寫基礎正則。

grep ‘[0-9a-zA-z]\+@[0-9a-zA-Z]\+\.\(com|cn\)$‘ all.txt
或者
grep -E ‘[0-9a-zA-z]+@[0-9a-zA-Z]+\.(com|cn)$‘ all.txt

 最後,對匹配IP地址在進行一次優化:

$ egrep ‘^([0-9]{1,3}\.){3}[0-9]{1,3}$‘ all.txt 

  

SED工具stream editor 流編輯器,和VI同源,處理文件,對文本進行修改!

常見用法:

sed option ‘script‘ file1 file2 ...               ’‘
sed 參數    ‘腳本(/pattern/action)’ 待處理文件

sed option -f scriptfile file1 file2 ...           
sed 參數 –f ‘腳本文件’ 待處理文件

參數說明:

a,    append             追加
i,    insert             插入
d,    delete             刪除
s,    substitution     替換

例子:在第二行插入XXXX

sed ‘2ixxxx‘ cash.sh

  -i 是直接修改源文件,需要謹慎使用

刪除第4-6行:

sed ‘4,6d‘ cash.sh

  替換read 為write:

sed ‘s/read/write‘ cash.sh

 SED常用指令:

/pattern/p 打印匹配pattern的行
/pattern/d 刪除匹配pattern的行
/pattern/s/pattern1/pattern2/ 查找符合pattern的行,將該行第一個匹配pattern1的字符串替換為pattern2
/pattern/s/pattern1/pattern2/g 查找符合pattern的行,將該行所有匹配pattern1的字符串替換為pattern2

  例如,匹配echo 並打印該行:

sed ‘/echo/p‘ cash.sh

  技術分享圖片

此時會顯示多一行,如果需要不輸入源文件內容,可以使用:

sed ‘/echo/p‘ cash.sh -n

  

刪除case所在行
$ sed ‘/case/d‘ case.sh 
將echo替換為print
$ sed ‘/echo/s/echo/print/g‘ case.sh 

地址符號的使用:

sed ‘s/23/-&-/‘ cash.sh

  技術分享圖片

\1 \2 代表對應的第一個單元 和 第二個單元

-r 可以使用拓展正則

技術分享圖片

去掉Html標簽:

sed -r ‘s/<[(/|0-9a-zA-Z)]+>//g‘ hello.html
或者
sed -r ‘s/<[^<>]+>//g‘ hello.html

  

 

  

shell腳本學習進階和正則表達示的應用