sed,awk

sed

  • sed的強項是替換字符,可是也能夠篩選,不過沒有顏色高亮顯示
  • 如圖,sed '/root/'p test.txt
  • 若是要篩選字符,必須寫在 '//' 中間,是特定格式
  • 因此想搜索關鍵字 root 就要寫做 '/root/'
  • 旁邊的 p 表示print打印,若是不寫,就不會顯示任何信息
  • 寫了 p 篩選內容纔會顯示在屏幕上
  • 後面test.txt是想搜索的文件名稱
  • 可是這樣有一個問題,如圖,執行命令後出現不少不須要的信息
  • 這是由於篩選完成後,這條命令還會把文件內的全文都打印到篩選信息下面
  • 如圖,第一行和第二行如出一轍
  • 第一行就是命令篩選出來的信息,第二行開始就是原文件全文的內容
  • 因此若是不想執行命令後,把原文件內容也打印出來,須要使用參數 n
  • 如圖,使用 -n 參數,下面就只會顯示篩選出來的信息,不會有原文的內容

  • 如圖,還可使用正則符號 + 來篩選
  • 可是須要使用 r 參數,或者脫義+號如 +
  • 參數 r 功能相似 grep 的參數 -E
  • 使用了r參數就能夠直接識別一些須要脫義的字符

  • 還能夠直接選擇顯示某一行
  • 如圖,sed -n '2'p test.txt 就能夠直接顯示原文件第二行內容
  • 寫數字能夠不用加 //
  • 如圖,這樣能夠顯示 第二行 到 第五行 的內容
  • 如圖,這樣能夠顯示第25行到最後一行的內容
  • 符號 $ 表明剩下的全部內容
  • 25,$ 就表示從 25行開始,而後到最後一行
  • 如圖 1,$ 這樣就能夠把全部內容都打印出來
  • 1,$ 表示從第一行開始,到最後一行
  • 也就是所有的內容

  • 參數 -e 能夠寫一段操做
  • 若是想在一條命令裏面執行多段操做,可使用 -e
  • 如圖,sed -e '1'p -e '/root/'p -n test.txt
  • 每一段操做都須要寫一次 -e
  • 每一個 -e 後面能夠寫一段操做
  • 命令會先執行第一段操做,而後再執行第二段操做
  • 圖中的篩選結果,第一行結果是第一段命令的結果
  • 下面兩行結果是第二段命令的結果

  • 也能夠不區分大小寫來匹配字符
  • 如圖,匹配條件是 '/bus/'Ip
  • p 是打印結果的意思,I 就是不區分大小寫的參數
  • 這裏加上 I 參數,就能夠不區分 bus 的大小寫來匹配

  • 如圖,這條命令意思是,刪除 1-25 行的內容,顯示剩下的內容
  • 參數 d 就是刪除的意思,條件 1,25 就表示1-25行
  • 下面顯示的結果就是刪除了1-25行後剩下的內容
  • 可是實際上,這個命令不會對原文件進行修改
  • 也就是說,實際上原文件並無被刪除任何內容
  • 若是一個文件很大,打開須要很長的時間
  • 就可使用這個命令,將不須要看的部分刪除,只看剩下的部分
  • 這樣就能夠節約時間,又不會對原文件形成修改

  • 除了不修改原文件刪除內容顯示外,還能夠對原文件進行修改
  • 如圖,使用了 -i 參數
  • 加入 -i 參數就能夠實際上對原文件進行修改
  • 也就是說把原文件的1-25行刪除
  • 下面 wc -l 查看文件總行數,只剩下5行,原本有30行的

  • 還能夠針對特定關鍵詞進行刪除
  • 如圖,'/user2/'d 這裏 user2 就是關鍵詞
  • 這條命令能夠把包含關鍵詞 user2 的數據行刪除掉
  • cat 查看文件,能夠看到 包含user2的行不見了

  • 上圖是查找替換的命令
  • 意思是把1-10行內,全部root都替換爲toor
  • 首先,1-10s 就表示1-10行的意思,s 參數就表明替換功能
  • 也就是1-10行內進行替換,表示替換的範圍
  • /root/toor/ 意思就是 root 被替換爲 toor
  • g 是全局替換的意思
  • 假設一行裏面有兩個 root,若是不加 g 參數,就只會替換第一個root
  • 只有使用了全局替換參數 g 纔會把每一行的每一個 root 都進行替換
  • 否則的話就只會替換每一行遇到的第一個 root

  • 替換也可使用正則表達式
  • 上圖,1,10s 表示在1-10行內替換
  • /ro+/r/ 意思是把符合正則 ro+ 的字符串都替換爲 r
  • g 就是全局替換,後面使用管道符而後用head顯示前10行
  • 能夠看到,第一行原本是 root 的地方變成了 rt
  • 這裏 sed -r 還須要用-r參數
  • 由於使用了正則表達式 + 號
  • 若是不加-r參數會不識別 + 號

  • 上圖是一個複雜的正則使用案例
  • head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
  • 這條命令是,先用 head 獲得 text.txt 的前十行內容,而後傳給後面的 sed 處理
  • 後面的 sed 對傳過來的內容進行處理,把第一列的內容與最後一列的內容進行調換
  • 首先 sed -r 由於正則使用了 + 因此要 -r 才能識別
  • 而後是 s ,表示替換的意思,前面沒有行數限制範圍,就表示替換範圍爲所有內容
  • 而後是 ([^:]+):(.*):([^:]+) 這表示被替換的內容格式
  • 結構是3個部分,三個() 中間是兩個 : 進行間隔,這就是被替換的內容格式
  • [^:] 表示任意非 : 的字符,[^:]+ 表示1個或者多個連續非 : 字符組合
  • ([^:]+) 小括號括起來表示這是一個總體
  • ([^:]+):表示第一個 : 加上左邊的非 : 字符
  • (.*): 表示任意多個字符一直匹配到最後一個 : 爲止
  • 而後最右邊是 ([^:]+) 也就是說最後一個 : 右邊的非 : 字符
  • 之因此每一個部分都要用 () 括起來,是由於可使用 \1 , \2 , \3 表明它們
  • 而後後面的被替換格式就是 \3:\2:\1
  • 意思就是把原來的 第一個() 與 第三個() 位置進行調換
  • 這樣 第一列 與 最後一列 就被調換了位置

  • 這個例子裏面,被替換的是 /sbin/nologin
  • 替換上面字符串的是 123
  • 原來的分隔符是 /
  • 可是由於被替換字符串裏面含有 / ,這樣會跟原來的分隔符 / 發生衝突
  • 系統會報錯,因此如今把原來的分隔符 / 換成了 @
  • 這樣就不會報錯了
  • 也可使用 脫義字符 \ 對 /sbin/nologin 進行轉換
  • 如 /sbin/nologin 可是這樣很難看,因此推薦使用 @ 代替 / 作分隔符

  • 這個是把原文全部大小寫字母刪除的例子
  • 首先,s 表示替換範圍是全文
  • [a-zA-Z] 表示被替換的字符是符合這個條件的字符
  • 任意一個字符只要是大寫字母,或者小寫字母都符合這個被替換條件
  • 而後後面是 // ,中間沒有寫任何東西,就是 空字符
  • 意思就是把任意 大小寫字母 替換成 空字符
  • 也就是把全文的字母都刪除了,下面能夠看到字母所有不見了

  • 這個案例是,在每一行的前面加上 aaa:
  • 首先是 sed -r 不少特殊符號不使用 r 參數都會不識別
  • 因此通常用到特殊符號的時候,前面都加上 -r 參數保證不出錯誤
  • 而後是 s 表示替換範圍是 全文
  • 而後是 (.*) 表示整行全部字符,小括號()表示這是一個總體
  • 也就是說,被替換的對象是整行全部字符
  • 而後 aaa:& ,這裏 & 就表示前面的小括號的內容
  • 也可使用 \1 表示前面的小括號
  • 當只有一個小括號的時候,可使用 & 表明前面的 小括號總體
  • 因此 aaa:& 就表示把 aaa: 放在了 (.*) 每行全部字符的前面
  • 這樣整條命令的意思就是,把原來的 每一行內容
  • 替換爲 aaa: + 原來的每一行內容
  • 也就是在原來每行內容的前面,加上了 aaa:

awk

  • awk 能夠支持分段篩選,就是能夠把一行字符分紅不一樣的段
  • awk -F ':' '{print $1}' test.txt
  • 這條命令的意思是,把test.txt的每行數據用 : 來進行分隔
  • 而後打印出第一段的數據
  • 這裏 -F 就是指定分隔符的選項, 而後後面接 ':' 就是把 : 指定爲每段的分隔符
  • 後面 '{print $1}' 就是打印第一段的意思, $1 就表示第一段
  • 若是使用 $0 ,就表示打印全部段,也就是說所有信息,$0表示全部段

  • 如圖,不使用 -F 參數,直接 print $0
  • 這樣就會把原文所有打印出來
  • 不過若是不設置 -F 分隔符的話,默認的分隔符就是 空格 或者 空白字符

  • 若是想同時打印 多段 字符
  • 如圖,使用 print $1,$3,$4 ,使用逗號分隔,寫上不一樣段的標號
  • 這樣就能夠打印出 第一段,第三段,第四段的信息

  • 還能夠在打印不一樣段信息的時候,設置不一樣段信息之間的分隔符
  • 如圖,使用雙引號加井號 "#" 這樣就設置了 # 做爲不一樣段的分隔符
  • 看下面打印出來的信息,不一樣段之間是用 # 分隔的,原來是空格

  • 如圖,使用 '/oo/' 就能夠篩選包含關鍵字 oo 的數據行

  • 這條命令意思是,分隔符爲 : ,篩選出 第一段 含有關鍵字 oo 的數據行
  • 這裏設置了 : 做爲分隔符來分段
  • $1 表示 第一段數據,符號 ~ 表示 匹配
  • 後面是 '/oo/' 就表示匹配 oo 關鍵字
  • 這樣就把每一行數據都用 : 進行了分段,而後就能夠找出每一行數據的第一段數據裏面
  • 含有 oo 關鍵字的那一行數據

  • 也能夠匹配正則表達式,如圖,匹配 oo+
  • 第一段數據含有關鍵字 o+(1-n)o 的數據行

  • awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt
  • 這條命令是執行了兩段指令
  • 第一段指令是 /root/ {print $1,$3}
  • 首先匹配包含 root 關鍵字的數據行,而後打印出 第一段 和 第三段
  • 第二段指令是 /user/ {print $1,$3,$4}
  • 首先匹配包含 /user/ 關鍵字的數據行,而後打印出 第一段,第三段,第四段
  • 這就是在一條命令裏面同時執行多段匹配
  • 下面使用 grep 匹配 root或者user 能夠看到
  • 上面匹配的數據行都是包含 root 或者 user 的數據行

  • 這裏,/root|user/ 意思就是匹配包含關鍵字 root 或 user 的數據行
  • 而後 print $0 就是打印整行

  • 如圖,還能夠進行 數值 的匹配
  • 第一條命令,$3==0 是指
  • 用 : 分隔每行數據,而後找出每行數據 第三段 等於 0 的數據行
  • 第二條命令增長了 {print $1} 就是隻打印 第一段 數據的意思
  • 第三條命令就是匹配 第三段 大於等於 1000 的數據行
  • 而後只打印 第一段 數據
  • 第四條命令跟第三條同樣,可是是打印整行數據
  • 還能夠對字符串進行布爾運算
  • 如圖,$7!="/sbin/nologin" 意思就是匹配 第七段 不等於 "/sbin/nologin" 的數據行
  • 符號 != 表示 不等號,由於 /sbin/nologin 是字符串,全部要用雙引號括起來

  • 還能夠把兩段數據進行比較匹配
  • 如圖,第一條命令的條件是 '$3<$4'
  • 意思就是匹配 第三段 小於 第四段 的數據行
  • 下面的結果,第三段的數值都比第四段小
  • 第二條命令匹配條件是 $3==$4
  • 意思就是匹配 第三段 等於 第四段 的數據行
  • 下面結果能夠看到,第三段數值都等於第四段數值

  • 還能夠同時使用多個條件匹配
  • 如圖, $3>"5" && $3<"7" 就表示匹配
  • 第三段數據包含 同時大於5小於7 的關鍵字 的數據行

  • 也可使用或者的條件匹配
  • 如圖,匹配條件是 $3>1000 || $7=="/sbin/nologin"
  • 意思是 第三段 大於 1000 或者 第七段 等於 /sbin/nologin
  • 符合以上條件的數據行會被匹配出來

  • 如圖,匹配條件是 $3>1000 || $7 ~ /bash/
  • 這個條件的意思是,第三段 大於 1000
  • 或者 第七段 包含關鍵字 bash
  • 符合以上條件的數據行會被匹配出來
  • $7 ~ /bash/ 意思就是在 第七段 裏面匹配 bash
  • 符合 ~ 表示匹配, // 中間的字符串就是要匹配的字符串

  • 可使用awk內置變量設置匹配後的數據分隔符
  • 如圖,{OFS="#"} 這裏 OFS 就是設置分隔符的變量
  • 賦值 # 給 OFS,這樣匹配以後的數據就會以 # 分隔
  • 這裏的語法是,先寫 變量,而後寫匹配條件,最後是 print 語句

  • 還能夠把條件語句跟print語句寫在一塊兒
  • 使用嵌套的花括號寫
  • {if ($3>1000) {print $1,$2,$3,$4}} 就是 $3 大於 1000 的數據行
  • 打印 第 1,2,3,4 段數據
  • 這就是把條件語句跟print語句用花括號括起來變成一體

  • 還有兩個awk內置變量,NR,NF
  • NR 表示 行號, NF 表示 段數
  • 如圖,條件是 {print NR":"$0}
  • 意思是 打印 NR(行號)+ 字符(:)+ 整行數據($0)
  • 下面的數據能夠看到,每行數據的開頭處,都多了 1:,3:等 行號+: 的數據

  • 還能夠顯示每一行的段數
  • 如圖, print NF":"$0
  • 就是 打印 每一行總共幾段(NF)+ : + 整行數據
  • 下面數據能夠看到,每行數據前面多了 數字+: ,數字就是 每行的段數

  • NR,NF 還能夠作判斷使用
  • 如圖,第一條命令 NR<=10 就是把前十行打印出來
  • 由於 NR<=10 就是行號在1-10之內的數據行會被匹配出來,也就是前十行
  • 第二條命令 NR<=10 && $1 ~ /root|sync/
  • 這是多項篩選,首先是 NR<=10 前10數據會被匹配出來
  • 而後是 $1 ~ /root|sync/ 第一段數據匹配關鍵字 root 或者 sync 的數據行
  • 符合 ~ 表明匹配,root|sync 就是 root 或 sync 的意思
  • 符合以上條件的數據行會被匹配出來
  • 第三條命令 NF==6 && $1 ~ /root|sync/
  • 首先匹配 NF==6 也就是段數爲 6 的數據行
  • 而後匹配 第一段包含關鍵字 root或sync 的數據行

  • 這個例子是在 NR 和 NF 前面都加上 $ 符號
  • 好比第一行打印的數據是 $1:$6
  • 由於第一行 NR 是 1 ,$NR 就是 $1 也就是第一行的第一段
  • 而後是 : + $6 ,由於第一行總共有6段
  • 因此 $NF 就是 $6 ,也就是第一行的第六段
  • 最後打印的數據就是 第一段 + : + 第六段
  • 而後後面的數據以此類推,第二行就是 第二段 + : + 第七段
  • 由於第二行總共有7段,第二行的行號是2

  • 除了判斷,還能夠賦值
  • 如圖,首先 head test.txt的前三行數據而後傳給後面的 awk命令
  • 而後在awk命令裏面 $1="root" 進行賦值
  • 而後看下面結果,前三行的第一段信息所有變成了 root
  • 這裏還使用了 OFS=":" 的參數
  • 由於使用賦值操做後,-F 不起做用,因此須要使用 OFS 參數才能設置分隔符

  • 這個例子是 求一列全部值的和
  • 首先 tot=tot+$3 是一個循環
  • tot是新建的一個變量,初始值默認爲0
  • 這個式子會循環每一行的第三段,也就是第三列數據,一直到最後一行爲止
  • 好比第一行的時候,tot=0
  • 因此 tot+$3 = 0 + 第一行第三段的值($3)
  • 而後第二次循環,由於 tot = 0+第一行第三段的值($3) = 第一行第三段的值($3)
  • 因此第二次循環就是 tot = 第一行第三段的值($3) + 第二行第三段的值($3)
  • 以此類推,直到最後一行,這樣就把全部行的第三段的值都相加了
  • 最後的結果就是 第三列的和
相關文章
相關標籤/搜索