最近學習shell命令,對grep,sed,awk命令有點混亂,故小結一下,鞏固一遍。
注意:find , grep , sed, awk可使用基本正則表達式字符,find,grep,awk也支持擴展的正則表達式元字符,grep使用擴展正則必須結合-E或直接使用egrep命令。
基本正則表達式元字符有:
* | 重復前面字符0次或多次 | . | 匹配任意字符一個,包括空格 | ^ | 匹配行首,但若在[]內則表示取反 |
[] | 匹配字符集 | \{\} | 精確匹配 | $ | 匹配行尾 |
\{n\} | 表示重復前面字符n次 | \{n,\} | 表示重復前面字符至少n次 | \{n,m\} | 表示重復前面字符n-m次 |
擴展正則表達式元字符有:
? | 匹配0個或1個前面的普通字符 | + | 匹配至少一個前面的字符 |
() | 字符集合 | | | 或,通常和()一起使用 |
上述部分元字符在通配時意義會不一樣,通配時如下:
* | 任意位任意字符 | ? | 一個任意字符 |
^ | 取反 | {,} | 或的關系 |
一、find命令:
基本格式:find 【路徑】【選項】【操作】
【選項】: -name , -type , -mtime, -size , -perm , -user , -group 等
【操作】:-print , -exec, -ok
(1)常用選項及意義:
-name :根據文件名查找文件。 如:查找當前目錄下的所有以“.py”結尾的文件(說明:“.”表示當前目錄,“*”正則基本通配符)
-type :根據文件類型進行查找,文件類型有d:目錄 - :普通文件 b:塊設備文件 l:符號鏈接文件 p:管道文件 c:字符設備文件
如:查找當前路徑下所有的目錄
-mtime :后接+n,表示文件更改時間距今在n天之前,-n表示文件更改距今在n天之內。
如:查找當前路徑下今天修改過的文件
-perm:根據文件權限查找文件。如:查找當前路徑下權限為764的文件,說明:7表示rwx,表示用戶(user)具有可讀可寫可執行權限,6表示rw-表示該用戶所屬屬組(group)具有可讀可寫無可執行權限,4表示r--表示其他用戶(others)僅有可讀權限
-user :根據文件屬主查找文件; -group:根據用戶屬組查找文件 -size : 根據文件大小查找文件 暫不作演示。
(2)操作名稱及其意義
- print: 將匹配到的文件輸出到標准輸出
-exec : 對匹配的文件執行該參數給出的命令,后面接的形式為:“命令” { } \;固定格式。
-ok:和-exec功能相同,只是在每次執行時會給出提示,讓用戶確定是否執行。
實例如下:
a. -print:查找當前路徑下今天修改過的文件,且文件權限為764的文件
b. -exec : 查找當前路徑下普通文件的詳細信息
c. -ok : 查找當前路徑下普通文件的詳細信息
二、grep命令:一種強大的文本搜索工具,與正則表達式結合使用
基本格式: grep 【選項】【模式】【文件....】
【選項】:常用的有-c,-i, -n ,-l , -w, -x, -r, -b ,-E,-F
-c | 只輸出匹配行的數量 | -n | 列出所有的匹配行,並打印行號 | -b | 打印匹配行距文件頭部的偏移量,單位:字節 | -x | 匹配整行 | -E | 支持擴展正則表達式 |
-i | 不區分大小寫 | -l | 只列出符合匹配的文件名,而不列出具體匹配行 | -w | 匹配整詞 | -r | 遞歸搜索 | -F | 不支持正則表達式,按字符字面意思匹配 |
【模式】:可以是字符串,變量,正則表達式,注意模式中包含空格時,需要用雙引號引起來。
實例1:搜索當前路徑下以.py,.txt,.sh結尾的文件中哪些包含hello字符串,要求不區分大小寫搜索,顯示文本行內容及行號。
分析:以.py,.txt,.sh結尾的文件—— “*.{py,txt,sh}”。不區分大小寫,使用-i選項。 顯示文本內容及行號,使用-n。如下兩種方式:
實例2:統計文本中的空行數,住:'^$'匹配空行
實例3:
a. 查找所有包含字符串“the”的行,如下,包含they字符的行也打印出來。
b. 精確匹配“the”這個單詞的行
方法一:使用精確匹配\< \>
方法二:使用-w選項。
c. 查找整行文本都是“the”的行:使用-x選項
三、sed命令:流編輯器
基本格式一:sed 【選項】 'sed命令' 輸入文件
基本格式二:sed 【選項】-f sed腳本文件 輸入文件
基本格式三: ./sed腳本文件 輸入文件
多個編輯命令時:
sed 【選項】 -e 'sed 命令1' -e 'sed 命令2' -e 'sed 命令n'
【選項】:
-n : 不打印所有行到標准輸出
-e : 表示將下一個字符串解析為sed編輯命令
-f : 表示調用sed 腳本
【定位文本方法】:
x:指定行號 x,y:從x到y行 /pattern/ :匹配pattern模式的行
/pattern/parttern2/ :匹配包含pattern和parttern2的行
x,y!:查詢不包括x到y的行
x,/pattern/:從模式x到pattern行進行匹配 /pattern/,x :從模式pattern到x行進行匹配
【sed編輯命令】:
常用:
p | 打印匹配行 | a\ | 匹配行后追加 |
i\ | 匹配行前插入 | = | 打印文件行號 |
r | 從另一個文件讀入 | w | 寫入到另一個文件 |
c\ | 新文本替換匹配行,整體替換 | n | 讀取下一個輸入行,用下一個命令處理新的行 |
s | 替換模式替換字符串 | y | 變換字符 |
d | 刪除定位行 | q | 第一個模式匹配成功后退出 |
{} | 在定位行執行命令組 |