今天主要跟大家介紹2個非常霸道的工具,sed和awk,本篇文章將介紹這兩個工具在日常運維中的常用用法,工作中這兩個工具要掌握好了在結合一些管道命令、正則表達式,日常處理事務簡直666啦! l Sed 1.強大的地方 擅長對數據行進行處理,sed是一種流編輯器,處理時,把當前處理的行存儲在臨時緩衝區中 ...
今天主要跟大家介紹2個非常霸道的工具,sed和awk,本篇文章將介紹這兩個工具在日常運維中的常用用法,工作中這兩個工具要掌握好了在結合一些管道命令、正則表達式,日常處理事務簡直666啦!
l Sed
1.強大的地方
擅長對數據行進行處理,sed是一種流編輯器,處理時,把當前處理的行存儲在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接著處理下一行,這樣不斷重覆,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。利用sed命令可以將數據行進行替換、刪除、新增、選取等特定工作。
2.用法
sed [-nefr] [動作]
選項:
-n:使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行或動作才會被列出來
-e :直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作;
-r :sed 的動作支持的是擴展型正規表示法的語法。(預設是基礎正規表示法語法)
-i :直接修改讀取的文件內容,而不是輸出到屏幕
動作說明: [n1[,n2]] function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為]
Function一般有以下參數:
a:新增,後面可以接字元串,而這些字元串會在新的一行出現(目前的下一行)
c: 替換,後面可以接字元串,這些字元串可以替換 n1,n2 之間的行
d:刪除
i:插入,後面可以接字元串,而這些字元串會在新的一行出現(目前的上一行)
p:列印,將某個選擇的數據列印出來。通常跟參數-n 一起運行
s:替換,用一個字元串替換另一個,註意與c參數的區別
3.舉例 我們用/ etc/passwd文件來演示,先來看看sed不加參數跟加上-n參數是怎樣的
看上圖明白選項一欄-n參數後面的解釋意思了吧,不加參數是輸出了文件所有信息並且多列印了第一行的數據,加上-n參數就只列印了第一行的數據,1p就是列印第一行,2p;4,10p就是列印第2行以及第4-10行啦
刪除第1-10行,留意行號變化
刪除第1行,第10行,留意行號變化
將passwd文件中包含/sbin/nologin替換為/bin/bash並列印輸出
將passwd文件中第2行的數據替換為test,註意到與s參數的區別了吧
在passwd文件第二行新增test字元串
在passwd文件第二行插入test字元串
刪除passwd文件的第三行至末尾行
l Awk
1.強大的地方
擅長對數據列進行處理,就是把數據逐行的讀入,以空格為預設分隔符再將每行切斷,對切斷的部分再進行分析處理。
2.用法
awk '條件類型1{動作1} 條件類型2{動作2} ...' filename 選項:
-F fs:欄位分隔符,fs是一個字元串或者是一個正則表達式,如-F:
如要對數據做特殊處理,可能還會用到awk的內置變數:
變數名稱 |
代表意義 |
NF |
每一行($0)擁有欄位總數 |
NR |
目前awk處理的第幾行 |
FS |
目前分隔符,預設是空格鍵 |
3.舉例
我們還是以/etc/passwd 文件為例。以:為分隔符,列印passwd 文件中每行用戶名稱user($1)及用戶uid($3)。補充:$0代表一整行數據的意思
列印passwd文件中uid>=500 的用戶名稱及UID
列印passwd每一行的數據,並以:為分隔符計算每行的字元總數列印在每行數據的末尾
列印passwd文件中以:為分隔符第三個欄位即UID>=500的數據所在行號
想想日常工作中如何要獲取文件中第幾行第幾列的數據應該如何操作,如列印passwd文件中第一行與最後一行第一列的數據,sed跟awk結合使用啦。
總結:關於sed跟awk日常要用到的用法就說到這裡啦,從事運維的同事一定要熟練運用這兩個工具哦,特別是需要經常做數據彙報的,能減輕很大工作量。