sed & awk & grep 專題( 鳥哥 )

grep, sed 與 awk 至關有用 !程序員

gerp 查找, sed 編輯, awk 根據內容分析並處理.正則表達式

 

awk(關鍵字:分析&處理) 一行一行的分析處理 awk '條件類型1{動做1}條件類型2{動做2}' filename, awk 也能夠讀取來自前一個指令的 standard input
相對於sed經常用於一整行處理, awk則比較傾向於一行當中分紅數個"字段"(區域)來處理, 默認的分隔符是空格鍵或tab鍵
例如:
last -n 5 | awk '{print $1 "\t" $3}' 這裏大括號內$1"\t"$3 之間不加空格也能夠, 不過最好仍是加上個空格, 另外注意"\t"是有雙引號的, 由於自己這些內容都在單引號內
$0 表明整行 $1表明第一個區域, 依此類推
awk的處理流程是:
1. 讀第一行, 將第一行資料填入變量 $0, $1... 等變量中
2. 依據條件限制, 執行動做
3. 接下來執行下一行
因此, AWK一次處理是一行, 而一次中處理的最小單位是一個區域
另外還有3個變量, NF: 每一行處理的字段數, NR 目前處理到第幾行 FS 目前的分隔符
邏輯判斷 > < >= <= == !== , 賦值直接使用=
cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t" $3}' 首先定義分隔符爲:, 而後判斷, 注意看, 判斷沒有寫在{}中, 而後執行動做, FS=":"這是一個動做, 賦值動做, 不是一個判斷, 因此不寫在{}中
BEGIN END , 給程序員一個初始化和收尾的工做, BEGIN以後列出的操做在{}內將在awk開始掃描輸入以前執行, 而END{}內的操做, 將在掃描完輸入文件後執行.
awk '/test/ {print NR}' abc 將帶有test的行的行號打印出來, 注意//之間可使用正則表達式
awk {}內, 可使用 if else ,for(i=0;i<10;i++), i=1 while(i<NF)
可見, awk的不少用法都等同於C語言, 好比"\t" 分隔符, print的格式, if, while, for 等等工具

awk 是至關複雜的工具, 真正使用時, 再補充吧. (有關工具的picture)spa

 

sed(關鍵字: 編輯) 以行爲單位的文本編輯工具 sed能夠直接修改檔案, 不過通常不推薦這麼作, 能夠分析 standard input
基本工做方式: sed [-nef] '[動做]' [輸入文本]
-n : 安靜模式, 通常sed用法中, 來自stdin的數據通常會被列出到屏幕上, 若是使用-n參數後, 只有通過sed處理的那一行被列出來.
-e : 多重編輯, 好比你同時又想刪除某行, 又想改變其餘行, 那麼能夠用 sed -e '1,5d' -e 's/abc/xxx/g' filename
-f : 首先將 sed的動做寫在一個檔案內, 而後經過 sed -f scriptfile 就能夠直接執行 scriptfile 內的sed動做 (沒有實驗成功, 不推薦使用)
-i : 直接編輯, 這回就是真的改變文件中的內容了, 別的都只是改變顯示. (不推薦使用)
動做:
a 新增, a 後面能夠接字符串, 而這個字符串會在新的一行出現. (下一行)
c 取代, c 後面的字符串, 這些字符串能夠取代 n1,n2之間的行
d 刪除, 後面不接任何東西
i 插入, 後面的字符串, 會在上一行出現
p 打印, 將選擇的資料列出, 一般和 sed -n 一塊兒運做 sed -n '3p' 只打印第3行
s 取代, 相似vi中的取代, 1,20s/old/new/gip

[line-address]q 退出, 匹配到某行退出, 提升效率字符串

[line-address]r 匹配到的行讀取某文件 例如: sed '1r qqq' abc , 注意, 寫入的文本是寫在了第1行的後邊, 也就是第2行input

[line-address]w file, 匹配到的行寫入某文件  例如: sed -n '/m/w qqq' abc , 從abc中讀取帶m的行寫到qqq文件中, 注意, 這個寫入帶有覆蓋性.ast


舉例:
sed '1d' abc 刪除 abc 檔案裏的第一行, 注意, 這時會顯示除了第一行以外的全部行, 由於第一行已經被刪除了(實際文件並無被刪除,而只是顯示的時候被刪除了)
sed -n '1d' abc 什麼內容也不顯示, 由於通過sed處理的行, 是個刪除操做, 因此不現實.
sed '2,$d' abc 刪除abc中從第二行到最後一行全部的內容, 注意, $符號正則表達式中表示行末尾, 可是這裏並無說那行末尾, 就會指最後一行末尾, ^開頭, 若是沒有指定哪行開頭, 那麼就是第一行開頭
sed '$d' abc 只刪除了最後一行, 由於並無指定是那行末尾, 就認爲是最後一行末尾
sed '/test/d' abc 文件中全部帶 test 的行, 所有刪除
sed '/test/a RRRRRRR' abc 將 RRRRRRR 追加到全部的帶 test 行的下一行 也有可能經過行 sed '1,5c RRRRRRR' abc
sed '/test/c RRRRRRR' abc 將 RRRRRRR 替換全部帶 test 的行, 固然, 這裏也能夠是經過行來進行替換, 好比 sed '1,5c RRRRRRR' abctest



grep(關鍵字: 截取) 文本蒐集工具, 結合正則表達式很是強大
主要參數 []
-c : 只輸出匹配的行
-I : 不區分大小寫
-h : 查詢多文件時不顯示文件名
-l : 查詢多文件時, 只輸出包含匹配字符的文件名
-n : 顯示匹配的行號及行
-v : 顯示不包含匹配文本的全部行(我常常用除去grep自己)
基本工做方式: grep 要匹配的內容 文件名, 例如:
grep 'test' d* 顯示全部以d開頭的文件中包含test的行
grep 'test' aa bb cc 顯示在 aa bb cc 文件中包含test的行
grep '[a-z]\{5}\' aa 顯示全部包含字符串至少有5個連續小寫字母的串效率

相關文章
相關標籤/搜索