grep, sed, awk 的用法

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 的話, 使用正則時, 需要使用 \ 符號進行轉譯特殊字符.

  • 指定開頭和結尾

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 腳本是由各種模式和操作組成,
  1. 模式

模式可以是以下幾種

  • 正則表達式: 使用通配符的擴展集
  • 關係表達式: 使用運算符進行操作, 可以是字符串或數字比較測試
  • 模式匹配表達式: 用運算符 ~(匹配)和 ~!不匹配
  • BEGIN 和 END 語句塊以及 pattern 語句塊
  1. 操作 操作是 一個或多個命令, 函數, 表達式組成的, 之間you換行符或者分號隔開, 並位於大括號內, 主要是由 變量, 數組賦值, 輸出命令, 和內置函數, 控制語句 組成.

3.4 awk 執行過程

  1. 第一步指執行 BEGGIN { commands } 語句塊
  • BEGIN語句:
    • 在awk 開始輸入輸出流中讀取行之前執行, 在 BEGIN 語句塊執行如變量初始化, 打印頭信息 等操作
  1. 從文件或標準輸入讀取一行, 然後執行 parttern{ commands } 語句塊
  • parttern 語句塊:
    • parttern 語句塊中通用的命令是最重要的部分, 如果沒有提供該塊語句, 則默認執行 { print }, 即打印讀取到的行, 該語句塊會在每次讀取新的一行時 都會執行一次, 直到行結束
  1. 第一步指執行 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章