這裡是我在網上書上收集的相關資料,因為這兩個工具很有名也很重要,所以這些資料會幫助我更好的了解和熟悉它們。
在《sed and awk》一書中(1.2 a stream editor)的解釋是:
sed本質上是乙個編輯器,但是它是非互動式的,這點與vim不同;同時它又是面向字元流的,輸入的字元流經過sed的處理後輸出。這兩個特性使得sed成為命令列下面非常有用的乙個處理工具。
sed本身是乙個管道命令,可以分析 standard input 的,主要是用來分析關鍵字的使用、統計等,此外還可以將資料進行替換、刪除、心中、選取特定行等功能。
sed命令的語法如下所示:
sed [-nefr] [動作]
引數說明:
-n : 使用安靜模式,一般所有來自stdin的資料會被列出到螢幕上,但是 -n 在可以只列出經過 sed 處理過的那一行。
-e : 直接在命令列模式上進行 sed 的動作編輯。
-f : 直接將 sed 的動作解除安裝乙個檔案內, -f filename 則可以執行 filename 內的 sed 動作。
-r : sed 的動作支援的是擴充套件型正規表示式的語法(預設是基礎正規表示式語法)。
-i : 直接修改讀取的檔案內容,而不是由螢幕輸出。
動作說明: [n1],[n2] function
n1,n2:不見得會存在,一般代表選擇進行動作的行數。
舉例來說:如果我的動作是需要在 10 到 20 行之間進行的,則「10,20[動作行為]」
function 有下面這些引數:
c:替換,c 的後面可以接字串,這些字串可以替換n1,n2之間的行!
d:刪除,因為是刪除,所以 d 後面通常不接任何引數。
p:列印,也就是將某個選擇的資料列印出來,通常 p 會與引數 sed -n 一起執行。
s:替換,可以直接進行替換工作。通常這個 s 的動作可以匹配正規表示式!
例如:1,20s/old/new/g 就是。
以行為單位的新增或刪除功能
案例(一)
nl /etc/passwd | sed '2,5d'
說明:
注:$表示最後一行。
案例(二)
nl /etc/passwd | sed '2a drink tea'
說明:
注:2a 中的 a 是指第二行後面,而 2i 中的 i 則是指第二行的前面。
案例(三)
nl /etc/passwd | sed '2a drink tea or ......\
drink beer'
說明:
以行為單位的替換與顯示功能
案例(一)
nl /etc/passwd | sed '2, 5c no 2-5 number'
說明:
案例(二)
nl /etc/passwd | sed -n '5,7p'
說明:
案例(三)
sed 's/要被替換的內容/新的內容/g'
說明:
案例(四)
下面是記錄一次獲取ip資料的過程:
第一步:先檢視源資訊,利用 /sbin/ifconfig 查詢 ip。
/sbin/ifconfig eth0
注:我們的目的是要獲得ip資料,那麼先利用關鍵字找出那一行。
第二步:利用關鍵字配合 grep 選取出關鍵的一行資料。
/sbin/ifconfig eth0 | grep 'inet addr'
注:因為只需要ip資料,所以接下來就是把不需要的內容都刪掉,那麼就需要乙個正規表示式來幫助實現:
^.*inet addr:
第三步:將 ip 前面的部分予以刪除
/sbin/ifconfig eth0 | grep 'inet addr' | \
sed 's/^.*inet addr://g'
注:上面的命令就把 ip 前面的資料刪掉了,那麼接下來就是把 ip 後面的資料也刪掉,此時的正規表示式則是:
bcast.*$
第四步:將 ip 後面的部分予以刪除
/sbin/ifconfig eth0 | grep 'inet addr' | \
sed 's/^.*inet addr://g' | sed 's/bcast.*$//g'
這樣就能把 ip 擷取出來了~~~
案例(五)
這裡主要是展示 sed 與正規表示式的配合使用。
假設我想在乙個檔案(你自己新建或者已有的,主要是測試而已)獲取man字樣的那幾行資料,但是#在內的批註我不需要,而且空白行也不要。
第一步:先使用 grep 將關鍵字 man 所在行取出來。
cat /home/man.config | grep 'man'
第二步:刪除掉批註之後的資料。
cat /home/man.config | grep 'man' | sed 's/#.*$//g'
第三步:那麼接下來就是把空白行刪除掉。
cat /home/man.config | grep 'man' | sed 's/#.*$//g' | \
sed '/^$/d'
直接修改檔案內容(慎重)
首先要特別提醒的是,要練習 sed 修改檔案內容的時候不能用任何系統配置檔案,最好是自己新建乙個測試文本來測試練習。
案例(一)
sed -i '/s\.$/\!/g' test.txt
說明:
案例(二)
sed -i '$a # this is a test' test.txt
說明:
簡單來說,awk 是乙個資料處理工具。
相比於 sed 常常作用於一整行的處理,awk 則比較傾向於將一行分成數個「字段」來處理。因此,awk 相當適合處理小型資料的資料處理。
對於程式語言來講,awk 是一種便於使用且表達能力強的程式語言,可應用於各種計算和資料處理任務。
基本語法
awk '條件型別1 條件型別2 ...' filename
last -n 5 // 僅取出登陸者的資料前五行(last 可以將登陸者的資料取出來)
如果我還要在這些資訊中取出:賬號與登陸者的ip,且賬號與ip之間以[tab]隔開,那麼可以這麼改命令:
last -n 5 | awk ''
上面是 awk 最常使用的動作,通過 print 的功能來講欄位的資料列出來,欄位的分割則以空格鍵或者[tab]按鍵來隔開。
上面的例子中,在每一行的每個欄位都是有變數名稱的,那就是$1,$2等變數名稱。
備註:$1 指的就是第一列,但是 $0 則是代表一整行(第一行)。
上面的例子中整個awk的處理流程:
(1)讀入第一行,並將第一行的資料填入$0,$1,$2等變數中;
(2)依據條件型別的限制,判斷是否需要進行後面的動作;
(3)昨晚所有的動作與條件型別;
(4)若還有後續的「行」的資料,則重複上面1~3的不知,直到所有的資料都讀完為止。
對於上面的案例指令 last -n 5 ... 來講,有幾點需要注意的:
注意: awk 後續的所有動作都是以單引號 「'」 括住的,由於單引號與雙引號都必須是成對的,所以 awk 的格式內容如查想要以 print 列印時,記得非變數的文字部分,包含一小節 printf 提到的格式中,都需要使用雙引號來定義出來,因為單引號已是 awk 的命令固定用法了。
last -n 5 | awk ''
awk 的運算子
值得關注的是那個等於 「==」 的符號,因為:
案例(一)
cat /etc/passwd | \
awk ' $3 < 10 '
說明:上面的指令執行的效果是查閱第三列小於10以下的資料,並且僅列出賬號與第三列。(在 /etc/passwd 當中是以冒號「:」來作為欄位的風,該檔案中第一欄位為賬號,第三欄位則是uid)
案例(二)
cat /etc/passwd | \
awk 'begin $3 < 10 '
說明:由於案例一中並沒有顯示出第一行的資料,那麼此命令則是把第一行也顯示出來了。利用 begin 關鍵字預先設定 awk 的變數。
案例(三)
此外 awk 還可以進行「計算功能」。
比如有乙個檔案,內容如下:
name 1st 2nd 3th
小a 1000 1000 1000
小b 2000 2000 2000
小c 3000 3000 3000
那麼怎麼計算每個人的總額呢?而且還需要格式化輸出,那麼可以這樣思考:
cat test.txt | \
awk 'nr==1
nr>=2'
說明: 玩轉Linux 神級工具 sed awk
這裡是我在網上書上收集的相關資料,因為這兩個工具很有名也很重要,所以這些資料會幫助我更好的了解和熟悉它們。在 sed and awk 一書中 1.2 a stream editor 的解釋是 sed本質上是乙個編輯器,但是它是非互動式的,這點與vim不同 同時它又是面向字元流的,輸入的字元流經過se...
DeBug Python神級工具PySnooper
github專案位址 安裝 pip3 install pysnooperimport pysnooper pysnooper.snoop def number to bits number if number bits while number number,remainder divmod num...
學習linux核心的神級書籍
有關核心的書籍可以用汗牛充棟來形容,不過只有一些經典的神作經住了考驗。首先是5本久經考驗的神作。linux核心設計與實現 簡稱lkd,從入門開始,介紹了諸如程序管理 系統呼叫 中斷和中斷處理程式 核心同步 時間管理 記憶體管理 位址空間 除錯技術等方面,內容比較淺顯易懂,個人認為是核心新人首先必讀的...