grep, sed, awk

這幾個工具是shell中很是好用的文本流處理工具,能夠進行查找,編輯或者分析等工做,它們都支持正則表達式,也支持使用shell內置的變量html

grep

grep是一個字符串比較工具,用於從文件中提取知足條件的行,條件的部分能夠使用正則表達式
$grep [-ABrn] [str] FilePathOrDirPath VS $find [路徑] [選項] [參數]
-A [n] #除了該行以外,也列出後續的n行
-B [n] #除了該行以外,也列出以前的n行
-n #顯示行號
-r #遞歸查找全部的目錄
示例文檔正則表達式

$ cat -n test_grep
     1  #include<stdio.h>
     2  int main(){
     3      printf("hello,world!");
     4  }
     5  
     6  
     7  角標
     8  見後文[^1]
     9  
    10  [^1]:This the first footnote
    11

栗子, 找到符合模式[a-g](的行:shell

$ grep '[a-g](' test_grep
    printf("hello,world!");

sed

sed是一個文本流編輯工具,對文件流以行爲單位進行替換,刪除,新增,提取等操做
$sed [-nefri] [n1[, n2]] [function] [字符串]
-n 只列出通過sed特殊處理的那一行
-e 直接使用命令行對文本流進行編輯,即便用function
-f 直接將sed編輯好的文本流寫入一個文件
-i 直接編輯文件內容,不在屏幕輸出
function的內容:工具

a\ :add, 將後接的字符串添加到[n1,n2]的下一行
c: change,,用後接的字符串替代[n1, n2]之間的行
d :delete, 刪除n1, n2之間的行
i\ :insert, 將後接的字符串添加到[n1, n2]的上一行
p:print打印,一般和-n一同使用
s:search,取代
栗子,將示例文件全部的main()變成main(void),顯示1到4行,注意若是使用行號表示處理的內容,能夠直接在後面接p,a\等命令,若是使用字符串,須要使用//將字符串和命令隔離開:命令行

$ sed -e 's/main()/main(void)/' test_grep|sed -n '1,4p'
#include<stdio.h>
int main(void){
    printf("hello,world!");
}

awk

awk既是一門語言也是一個文本流處理工具,這裏咱們只說做爲命令的awk,awk是對文本流以字段爲單位進行替換,刪除,新增,提取等操做的工具, 默認的字段的分隔符爲」tab「或」空格「,能夠使用-F來從新指定
$awk [-Ffv]'條件類型1{動做1}條件類型2{動做2}...' filename
-F表示從新設置分隔符,awk的默認分隔符是tab或空格,不過不指定,是這樣的:code

$ last -n 3
jiang    pts/0        :0               Mon Sep 19 17:34   still logged in   
jiang    pts/0        :0               Mon Sep 19 16:50 - 16:50  (00:00)    
jiang    pts/0        :0               Mon Sep 19 16:29 - 16:43  (00:14) 
$ last -n 4|awk '{print $1}'
jiang
jiang
jiang
jiang

若是指定了以「M」爲分隔符`:htm

$ last -n 3|awk -F 'M' '{print $1}'
jiang    pts/0        :0               
jiang    pts/0        :0               
jiang    pts/0        :0

awk有三個內建變量來表示處理的行有的數據信息:
NF 每一行擁有的字段總數
NR 目前awk所處理的是第幾行的數據
FS 目前的分隔字符,默認是"空格"
能夠使用>, <, >=, <=, ==, != 來作邏輯判斷blog

相關文章
相關標籤/搜索