1. grep 和 egrep 工具
1.1 簡介
grep (global search regular expression and print out the line) 全面搜索正則表達式並把匹配的行打印出來 , 是一種很強大的文本搜索工具, egre 是 grep 的擴展, 支持更多的 re 元字符, 還有fgrep 是把所有的字母當做單詞, 也就是說正則表達式中的元字符表示晦氣自生的字面意義, 不在特殊, linux 使用的是 GUN 版本的 grep, 可以通過 -G, -E, -F 命令來使用 egrep 和 fgrep 的功能
1.2 grep 常用用法
-
語法:
grep [OPTIONS]
-
選項
-a: --text 不忽略二進制的數據
-A<N>: --after-context=<N> 除了顯示匹配到的行外, 還會顯示該行後面的<N>行
-b: --byte-offset 在顯示該行內容前 會列出該列第一個字符在文件中的字符偏移量
-B <N>: --before-context=<N> 顯示匹配到的行, 還會顯示該行前面 <N>行的內容
-c: --count 統計符合匹配的行數
-C<N>: --context=<N> 除了顯示匹配行外, 會顯示該行前後各<N> 行的內容
-d<動作> 指定查找的是目錄而非問阿金時, 必須使用該參數, 否則 grep 會停止動作
-e<範本>: 指定需要作爲查找文件內容的範本.
-E --extended-regexp 將範本作爲擴展表示方法來使用, 等同於使用 egrep
-f <範本>: 指定範本文件, 其內容包含一個或多個範本, 讓grep 查找符合條件的內容
-F: --fixed-regexp 將範本規則視爲固定字符串的列表
-G: 將範本視爲普通的表示方法來使用
-h: 顯示符合範本樣式的一列前, 不標該列所屬的文件名稱
-H: 顯示符合範本 一列之前, 標識該列所屬文件名稱
-i: 忽略大小寫
-l: 列出內容符合指定範本的文件名
-L: 累出文件內容不符合指定的樣式的文件名稱
-n: 顯示符合樣式的一行之前, 標出該行的 行號
-q: 不顯示任何信息
-r: 此參數的效果和 -d resurce 相同
-s: 不顯示錯誤信息
-v: 顯示不包含匹配文件的所有行
-V: 顯示版本信息
-w: 只顯示全符合的列
-x: l只顯示全列的符合的列
y: 該參數與 -i 相同
1.3 示例
- 從passwd 文件檢索 'root', 顯示行號
- 檢索內容, 不區分大小寫
- 檢索不包含root 的行
- 檢索到內容並顯示該行內容前後各兩行.
- 使用正則表達式檢索文件內的內容
- 如果如果不適用 egrep 或 grep -E 的話, 使用正則時, 需要使用
\
符號進行轉譯特殊字符.
- 如果如果不適用 egrep 或 grep -E 的話, 使用正則時, 需要使用
- 指定開頭和結尾
2. 正則表達式
2.1 什麼是正則表達式
Regular expression(正則表達式) 是由一類特殊字符以及文本字符編寫的模式, 其中某些字符(元字符)具有特殊的含義, 可以控制或通配功能
2.2 那些程序正則表達式
linux 中常用的文本工具都是支持正則表達式的, 比如 grep, sed, awk, vim, less. 某些服務也是支持使用正則作爲匹配方式的, 如 nginx, carnish 幾乎所有的編程語言都是支持使用正則的.
2.3 正則表達式字符分類
1. 元字符
正則中常常使用元字符來表示一類字符, 而不用直接指明該字符. 常用元字符有:
^ 以某一個字符(串)爲行首,
$ 匹配某個字符爲結尾
. 表示一個任意字符
\b 不會消耗任何字符, 只是匹配一個字符的單詞邊界, 比如 \bis\b 表示一個完整單詞is, 兩側都是空白
\d 匹配數字
\w 匹配字母, 數字, 下劃線
\s 匹配空格, 多個空格可以使用 \s+
[] 匹配中括號範圍內的一個內容, 比如 [ab1] 表示只匹配, a或b或1, 可以使用 [a-z] 匹配一個範圍
() 將一段表達式, 作爲整體
x|y x或y, | 表示左邊內容或右邊內容
# 幾種反義
\W 匹配非字母,數字,下劃線
\S 匹配非空格字符
\D 匹配任意非數字字符
\B 匹配不是單詞開頭的字符
[^] 匹配非中括號內的內容
# 字符類
[[:alpha:]] 任何字母
[[:digit:]] 任何數字
[[:alnum:]] 任何字母和數字
[[:space:]] 任何空白字符
[[:upper:]] 任何大寫字母
[[:lower:]] 任何小寫字母
[[:punct:]] 任何標點符號
[[:xdigit:]] 任何16進制的數字,相當於[0-9a-fA-F]
2. 重複次數
* 前一個子表達式出現 0次或者更多次
+ 前一個子表達式出現 1次或更多次
? 重複 0次或1次
{n} 重複 n次
{n,} 最少重複 n次
{n,m} 最少重複 n次, 最多m次
3. sed 命令用法
3.1 sed 是什麼
sed 是一種流編輯器, 用於處理文本的工具, 能夠完美的配合正則表達式使用, 功能非常強大, sed 是非交互式的編輯(編輯過程不需要用戶參與), 使用預設定的指定對文本進行編輯, 完成後輸出結果.
- 工作原理 sed 在處理文件時, 會將處理的行存儲在臨時緩衝區內, 稱爲'模式空間', 接着sed 會處理緩衝區 內的內容, 處理完成後會將該行內容輸出到屏幕上, 接着處理下一行, 知道文件結束, 這樣處理 文件本身內容是不會被修改的, 除非指定修改源文件.
3.2 sed 命令的語法, 選項, 命令, 替換標記
-
語法:
sed [opitons] 'command files
-
選項
-e <script> 用選中的指定 script 來處理文本文件
-f <script> 使用script 文件來處理文件
-h: 幫助信息
-i [擴展名] 直接修改文件, 如果指定了擴展那名, 則備份文件
-l N: 指定'l' 命令的換行期望週期
-n 不會自動打印全部內容
--posix: 關閉 GUN 擴展
-r: 在腳本中使用 擴展的表達式
-s: 將輸入文件視爲各個獨立的文件, 而不是一個長的連續輸入
- 命令
a\\ 在當前行下面插入文本
i\\ 當前行上面插入
c\\ 選定的行跟新
d 刪除選擇的行
D 刪除模板的第一行
s 替換指定的字符
h 拷貝模板內容到緩衝區
H 追加模塊內容到緩衝區
g 獲得內存緩衝區的內容, 並替換當前模板塊中的文本
G 獲得內存緩衝區的內容, 並追加到當前模板塊文本後面
l 列表不能打印字符的清單
n 讀取下一行輸入, 用下一個命令處理新的行 而不是第一個命令
N 追加下一輸入行到模板後面並在二者之間嵌入一個新行
p 打印模板行
P 打印模板 的第一行
q 退出 sed
b lable 分支到腳本帶有標記地方, 如果不存在, 則分支到腳本末尾
r file 從 file 讀取行
t label 錯誤分支, 從最後一行開始, 一旦發生錯誤, 導致分支到標記命令處
w file 寫並追加模板到 file 末尾
W file 寫並追加模板的第一行 到file 末尾
! 表示某明命令對所選沒有選定的行發生作用
= 打印當前行號
# 把註釋擴展到下一個換行符前面
- 替換標記
g 行內全體換
p 打印行
w 把行寫入一個文件
x 表示互換模板中的文本和緩衝區中的文本
y 把一個字符翻譯爲另一個字符(不用於正則表達式)
\\1 子串匹配標記
& 已匹配的字符串
- 元字符集
^ 匹配行開始, 如: /^a/ 匹配所有a 開頭的行
$ 匹配行結束
. 任意一個字符
* 匹配 0個或更多個字符
[] 匹配 一個指定範圍內的字符, 如[ab] 表示匹配a或b
[^] 匹配指定範圍 外的字符
& 保存搜索的字符串用來替換其他字符, 如: /abc/--&--/ 會將 abc替換成--abc--
\(\)/\1 後項引用, 如: /s/\(abc\)def/\1XXX/ 這一段會匹配 abcdef 字段, 並將其替換成 abcXXX, 這裏的 \1 就是後項引用了前面的 第一個() 內的內容,
\b 匹配單詞邊界, 如\babc\b 表示匹配abc 這個詞
x{n} 匹配 x 字符 出現 n 次
x{n,} 匹配 x 字符, 最少出現 n 次
x{n,m} 匹配 x 字符, 最少出現 n 次, 最多 m 次
3.3 示例
- 將passwd 文件內的 root 替換成 fangfc
- 將所有數字替換成000
- 僅顯示被修改過的行
- 修改 test開頭的行, 將其home 修改爲
3. awk 工具
3.1 awk 是什麼
awk 是一種便於使用且表達力強的工具, 是一種變成語言, 用於linux/unix 下的文本處理, 數據可以是來自標準輸出或文件, 支持用戶自定義函數 和正則表達式, 多出場景是作爲腳本內的文本處理工具來使用.
3.2 語法和選項
-語法:
-
awk [options] 'script' file
-
awk [options] 'BEGIN{command} partten{ commands } END { commands }' file
-
常用選項
-F fs 指定文件內的分隔符, 可以指定一個正則表達式
-v 賦值一個用戶定義的變量
-f FILE 從文件中讀取 script 或者直接是一個 awk script 腳本
3.3 模式和動作
- awk 腳本是由各種模式和操作組成,
- 模式
模式可以是以下幾種
- 正則表達式: 使用通配符的擴展集
- 關係表達式: 使用運算符進行操作, 可以是字符串或數字比較測試
- 模式匹配表達式: 用運算符 ~(匹配)和 ~!不匹配
- BEGIN 和 END 語句塊以及 pattern 語句塊
- 操作 操作是 一個或多個命令, 函數, 表達式組成的, 之間you換行符或者分號隔開, 並位於大括號內, 主要是由 變量, 數組賦值, 輸出命令, 和內置函數, 控制語句 組成.
3.4 awk 執行過程
- 第一步指執行
BEGGIN { commands }
語句塊
- BEGIN語句:
- 在awk 開始輸入輸出流中讀取行之前執行, 在 BEGIN 語句塊執行如變量初始化, 打印頭信息 等操作
- 從文件或標準輸入讀取一行, 然後執行
parttern{ commands }
語句塊
- parttern 語句塊:
- parttern 語句塊中通用的命令是最重要的部分, 如果沒有提供該塊語句, 則默認執行 { print }, 即打印讀取到的行, 該語句塊會在每次讀取新的一行時 都會執行一次, 直到行結束
- 第一步指執行
END { commands }
語句塊
- END語句:
- 在awk 讀取完所有行時 被執行的語句塊, 通常用於打印分析結果, 信息彙總.
3.5 awk 內置變量
$N 當前記錄的第 N個字段
ARGC 命令行元組數
ARGIND 命令行中當中文件的位置,( 用於處理多文件時, 記錄當前文件的偏移量)
CONVFMT 數字轉化格式,(默認 %.6g)
ERRNO 最後一個系統錯誤描述
FIELDWIDTHS 字列寬度(用空格分割)
FILENAME 當前鍵入的文件名
FNR 當前文件中記錄號
FS 輸入域 的分隔符, 默認是空格
RS 輸入域 記錄分隔符
NF 當前記錄域的個數
NR 目前爲止的記錄數
OFS 輸出域的分隔符
ORS 輸出與的 記錄分割符
4 示例
- 列出 passwd 中uid 大於1000 的用戶
- 顯示 passwd 文件中 fangfc 用戶和 root 描述和 家目錄
- 顯示本地兩塊網卡的IP
END