引言
grep、sed和awk都是文本處理工具,雖然都是文本處理工具單卻都有各自的優缺點。在接下來的內容中,將會詳細介紹三種命令的使用。
-
grep:grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。文本過濾器,如果僅僅是過濾文本,可使用grep,其效率比其他的高很多。(過濾文本)
-
sed:可以按行處理數據
-
awk:報告生成器,格式化以後顯示。如果對處理的數據需要生成報告之類的信息,或者你處理的數據是按列進行處理的,最好使用awk。(處理列)
awk命令使用
AWK是一種處理文本文件的語言,是一個強大的文本分析工具。
之所以叫AWK是因爲其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
- awk使用標準格式
awk 選項參數 '{pattern + action}' {filenames}
選項參數 | 含義 |
---|---|
-F fs or --field-separator fs | 指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:。 |
-v var=value or --asign var=value | 賦值一個用戶定義變量。 |
-f scripfile or --file scriptfile | 從腳本文件中讀取awk命令。 |
-mf nnn and -mr nnn | 對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。 |
- 示例1
源文件如下
取出文件某一列
- 示例2
格式化輸出
- 示例3
使用正則取出含有字母e的第一列以及第二列
- 示例4
awk內部使用if語句
- 示例5
awk中使用循環
awk具有豐富的內置變量可以使用
參數 | 描述 |
---|---|
ARGC | 命令行參數個數 |
ARGV | 命令行參數排列 |
ENVIRON | 支持隊列中系統環境變量的使用 |
FILENAME | awk瀏覽的文件名 |
FNR | 瀏覽文件的記錄數 |
FS | 設置輸入域分隔符,等價於命令行 -F選項 |
NF | 瀏覽記錄的域的個數 |
NR | 已讀的記錄數 |
OFS | 輸出域分隔符 |
ORS | 輸出記錄分隔符 |
RS | 控制記錄分隔符 |
grep使用
grep可以用於搜索文件中特定模式的子串
命令的標準使用格式爲
grep [option] "string_to_find" filename
其中option中的常用的命令爲
命令 | 含義 |
---|---|
-i | 忽略搜索字符串的大小寫 |
-v | 取反,即輸出不匹配的那些文本行 |
-n | 輸出行號 |
-l | 輸出能夠匹配模式的文件名,相反的選項爲-L |
-q | 靜默輸出 |
- 示例1
搜索以we開頭的行
grep "^we" test0.txt
運行結果爲(其中^表示開頭)
- 示例2
搜索不以we開頭的字符串
grep -v "^we" test0.txt
- 示例3
統計匹配成功的行數
- 示例4
匹配 以we開頭的行,並顯示行號
- 示例5
統計匹配成功的次數
其中源文件爲
sed使用
sed 【options】 ‘【command】’ 【filename】
其中options:
命令 | 含義 |
---|---|
-n | 抑制自動(默認的)輸出 讀取下一個輸入行,-n要讀取的行號 |
-e | 執行多個sed命令 |
-f | 運行腳本 |
-i | 編輯文件內容 |
-i.bak | 編輯的同時創造.bak的備份 |
-r | 使用擴展的正則表達式 |
其中command
命令 | 含義 |
---|---|
a | 在匹配後追加 |
i | 在匹配後插入 |
p | 打印 |
d | 刪除 |
r/R | 讀取文件/一行 |
w | 另存 |
s | 查找 |
c | 替換 |
y | 替換 |
h/H | 複製拷貝/追加模式空間(緩衝區)到存放空間 |
g/G | 粘貼 從存放空間取回/追加到模式空間 |
x | 兩個空間內容的交換 |
n/N | 拷貝/追加下一行內容到當前 |
D | 刪除\n之前的內容 |
P | 打印\n之前的內容 |
b | 無條件跳轉 |
t | 滿足匹配後的跳轉 |
T | 不滿足匹配時跳轉 |
- 示例1
我對文件name.txt操作
源文件內容如下所示
對源文件中的23替換爲00
root@1032:~/shell/dirfor$ sed -i 's/23/000/g' name.txt
修改之後結果爲
- 示例2
在文件的行首添加id
root@1032:~/shell/dirfor$ sed -i 's/^/&id /g' name.txt
其中s表示在全文檔中尋找,^表示行首位置,代碼運行結果爲