Shell三劍客(grep、sed、awk)

一、grep

grep的一些正則表達式的鏈接,之前寫過,所以這篇就不多描述了(點擊這裏跳轉)
grep命令——檢索和過濾文件內容 (在文件中去查找並顯示包含指定字符串的行)
語法結構: grep 選項 查找條件 目標文件
選項:
-i 查找內容時忽略大小寫
-v 條件反轉 (和所寫的條件正好完全相反)
-n 顯示行號





二、sed流編輯器

(1)sed簡介:

sed是一種流編輯器,它是文本處理中非常適中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的’行‘存儲在臨時緩衝區中,又稱爲 ‘模式空間’(pattern space) ,接着使用sed命令再去處理緩衝區中的內容,處理完成後,把緩衝區的內容輸出到屏幕上,接着再去處理下一行,這樣不斷重複,知道處理到文件的末尾,文件內容並沒有改變(也可以加選項,去直接修改文件,或者使用重定向指定文件,存儲數據)
sed主要用來自動編輯一個或多個文件,簡化對文件的反覆操作,編寫轉換程序等

(2)工作流程:

  • 讀取——執行——顯示
  • 常見用法:
    sed [選項] ‘操作’ 參數
    sed [選項] -f scriptfile 參數
    參數就是文件,也就是指定的待處理的文本文件列表


- 常見選項

1. -e<script>  expression=<script>:一選項中的指定的 script來處理輸入的文本文件
2. -f<script文件>  file=<script文件>:以選項中指定的script文件來處理輸入的文本文件
3. -h或  help:顯示幫助
4. -n或  quiet或——silent:僅顯示script處理後的結果
5. -V或  version:顯示版本信息
6. -i  直接編輯文本文件(加了這個選項後,你的操作會直接修改文本文件)

- 常見操作

1. a\ 在當前行下面插入文本。
2. i\ 在當前行上面插入文本。
3. c\ 把選定的行改爲新的文本。
4. d 刪除,刪除選擇的行。
5. D 刪除模板塊的第一行。
6. s 替換指定字符
7. h 拷貝模板塊的內容到內存中的緩衝區。
8. H 追加模板塊的內容到內存中的緩衝區。
9. g 獲得內存緩衝區的內容,並替代當前模板塊中的文本。
10. G 獲得內存緩衝區的內容,並追加到當前模板塊文本的後面。
11. l 列表不能打印字符的清單。
12. n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
13. N 追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼。
14. p 打印模板塊的行。
15. P(大寫) 打印模板塊的第一行。
16. q 退出Sed。
17. b lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
18. r file 從file中讀行。
19. t label if分支,從最後一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
20. T label 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
21. w file 寫並追加模板塊到file末尾。  
22. W file 寫並追加模板塊的第一行到file末尾。  
23. ! 表示後面的命令對所有沒有被選定的行發生作用。  
24. = 打印當前行號碼。  
25. # 把註釋擴展到下一個換行符以前。 

- sed替換標記

1. g 表示行內全面替換。  
2. p 表示打印行。  
3. w 表示把行寫入一個文件。  
4. x 表示互換模板塊中的文本和緩衝區中的文本。  
5. y 表示把一個字符翻譯爲另外的字符(但是不用於正則表達式)
6. \1 子串匹配標記
7. & 已匹配字符串標記

- sed元字符集

1. ^  匹配行開始
2. $  匹配行結束
3. . 匹配一個非換行符的任意字符
4. * 匹配0個或多個字符
5. [] 匹配一個指定範圍內的字符
6. [^] 匹配一個不在指定範圍內的字符
7. \(..\) 匹配子串,保存匹配的字符
8. & 保存搜索字符用來替換其他字符
9. \< 匹配單詞的開始
10. \> 匹配單詞的結束
11. x\{
   
   m\} 重複字符x,m次
12. x\{
   
   m,\} 重複字符x,至少m次
13. x\{
   
   m,n\} 重複字符x,至少m次,不多於n次

sed用法示例

創建測試文件: (之後的測試都是按這個文本來的,直接複製就行)

[root@localhost ~]# cat test.txt 
he was short and fat.
He was wearing a blue polo shirt with black pants.
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword.
The year ahead will test our political establishment to the li
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
AxyzxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.

(1)輸出符合條件的文本

——輸出所有內容,等同於cat test.txt
輸出所有內容
——輸出第三行
輸出第三行
——輸出第三到五行
輸出第三到五行
——輸出所有奇數行 (n 表示讀入下一行)
輸出所有奇數行
——輸出所有偶數行
輸出所有偶數行
——輸出1-5奇數行
輸出1-5的奇數行
輸出第十行至文件末尾的偶數行
——輸出第四行至第一個包含the的行(也就是第四行開始,一直篩選到下一個包含the的行,這裏是第五行就有the,所以篩選了兩行)輸出第四行至第一個包含the的行
——輸出包含the的所在行的行號(= 用來輸出行號,只顯示行號)
輸出包含the的行的行號
——輸出以PI開頭的行(^以PI開頭)
輸出以PI開頭的行
——輸出以數字結尾的行($就是以什麼什麼結尾)
輸出以數字結尾的行
——輸出包含單詞wood的行<單詞>表示單詞邊界(即想要篩選包含單詞的行就要使用\<wood\>這種的)
輸出包含單詞wood的行




















(2)刪除符合條件的文本 ’d’

nl ——計算文件的行數
也就是說可以配合nl然後操作sed去刪除指定的行數
nl顯示行數
——刪除第三行 (因爲全截圖的話就太大了,所以之後都是局部截圖,主要是知道效果即可)
刪除第三行
——刪除三到五行
刪除三到五行
——刪除包含cross的行
刪除包含cross的行
——刪除不包含cross的行 (!即相反的意思!d即是反向刪除不帶cross的行)
刪除不包含cross的行
——刪除開頭爲小寫字母的行
刪除開頭爲小寫子母的行
——刪除以’ . ‘結尾的行('/\.$/d' ,這個d前面的/容易打成\,操作時要注意)
刪除以'.'結尾的行
——刪除空行
刪除空行
——刪除重複的空行(這個等同與cat -s test.txt,)
刪除重複的空行

















(3)替換符合條件的文本

——將每行的第一個the替換爲THE
每行的第一個the替換爲THE
——將每行中的第二個l替換爲L
將每行的第二個l替換爲L
——每行開始添加#字符(其實就是把開頭換成#)
開頭換成#
——將3-5行的所有的the替換爲THE(3,5就是三到五行,後面加了g就是所有的意思)3-5行所有the換成THE





(4)遷移符合條件的文本

操作符:

  • H 複製到剪貼板;
  • g,G 將剪貼板中的數據覆蓋/追加到指定行;
  • w 保存爲文件;
  • r 讀取指定文件;
  • a 追加指定內容
    ——將包含the的行,遷移到行尾(;用於多個操作,和管道符差不多,H複製到剪貼板---d刪除---$G追加到行尾)
    包含the的行遷移到行尾
    ——將1-5行遷移到17行後
    將一到五行遷移到17行
    ——將包含the的行另存爲新文件(w就是另存爲,另存爲到out.file)




在這裏插入圖片描述
在這裏插入圖片描述
——在包含the每行後添加文件hostname內容(/the/r就是包含the的每行後面都加上/etc/hostname的內容,也就是讀取了指定文件的內容)
在這裏插入圖片描述
——在第3行後插入新行,內容爲New (a也就是添加了指定內容)
在第三行後插入新行




(5)使用腳本編輯文件

使用sed腳本,將多個編輯指令存放到文件中(每一行一條編輯指令),通過 -f 的方式調用
——將1-5行遷移到17行後

使用sed:sed
使用腳本:
腳本
效果其實是一樣的


三、awk工具

簡介:
awk是行處理器,相比較屏幕處理的優點,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,通常用來格式化文本信息

(1)awk工作流程

#awk -F ‘:’ ‘{print $1,$3,$4}’ /etc/passwd
按這條命令來說:

  • awk命令會逐行讀取文件的內容進行處理
  • awk以’:’爲分隔符,將第1行數據格式化爲7段,每段數據存入$1–$7變量中。$0存儲這1行數據,-F即是按什麼字符來分割,這裏寫的就是-F:,說明以:來分割
  • 一行處理完成繼續處理下一行,直到此文件讀取結束
    執行完命令後的結果:
    結果

(2)awk常見用法

  • awk 選項 ‘模式或條件 { 編輯指令 }’ 文件1 文件2 …
  • awk -f 腳本文件 文件1 文件2 …

(3)特殊的內建變量

$0           表示整個當前行
$1           每行第一個字段
NF          字段數量變量
NR          每行的記錄號,多文件記錄遞增
FNR        與NR類似,不過多文件記錄不遞增,每個文件都從1開始
\t            製表符
\n           換行符
FS          BEGIN時定義分隔符
RS       輸入的記錄分隔符, 默認爲換行符(即文本是按一行一行輸入)
~            匹配,與==相比不是精確比較(包括)
!~           不匹配,不精確比較
==         等於,必須全部相等,精確比較
!=           不等於,精確比較
&&      邏輯與
||             邏輯或
+            匹配時表示1個或1個以上
/[0-9][0-9]+/   兩個或兩個以上數字
/[0-9][0-9]*/    一個或一個以上數字
FILENAME 文件名
OFS      輸出字段分隔符, 默認也是空格,可以改爲製表符等
ORS        輸出的記錄分隔符,默認爲換行符,即處理結果也是一行一行輸出到屏幕
-F'[:#/]'   定義三個分隔符
{
   
   print} 類似於顯示的意思,後面可以跟$位置變量顯示相應的字段

用法示例:

(1)按行輸出文本

——輸出1-3行內容(NR==即是指定行數)
輸出1-3行內容
這裏(NR>=1)&&(NR<=3)和上面的NR==1,NR==3意思其實是一樣的
輸出一到三行內容
——輸出奇數行(%2求模運算,餘數爲1是奇數,0爲偶數 )
奇數行
——輸出偶數行
偶數行
——統計以/bin/bash結尾的行(和grep -c "/bin/bash$"其實是一樣的,grep的更簡單一點,看個人喜好)
統計








(2)按字段輸出文本

(這個感覺更常用一點,用法(1)的grep也能做到)
——輸出每行中以空格分割的第3個字段(運用了位置變量與之配置,不加-F即默認是空格來分割)
輸出第三個字段
——密碼爲空的行 (我這個沒有密碼爲空的用戶所以篩選不出來)
密碼爲空的行
——輸出第7個字段不是/bin/bsh也不是/sbin/nologin的行(!=就是不相同)
輸出第七字段





(3)通過管道符、雙引號調用shell命令

示例1:
條件:調用wc -l 命令統計使用bash的用戶個數

  • 使用awk工具執行
    awk
  • 使用grep命令執行
    grep
    (效果是一樣的)

示例2:
條件:調用w命令,統計在線用戶數

  • 使用awk工具執行
    awk
  • 使用常規命令執行 (所得減去2就是在線用戶數量,可以先試試w這個命令,前兩行是時間日期等)
    在這裏插入圖片描述
    w命令
    主要是看敲完命令後的效果,發現規律後就很好理解了,選項雖然多,但是好多也不常用,有時間的話記一下就可以,也不用全都記住,但是最起碼給一個sed這類的表達式什麼的得能看懂


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