sed和gawk
sed和gawk是shell腳本中必須熟練掌握的兩個命令工具;這一節我們詳細掌握sed命令的用法;
1、文本處理
sed和gawk為Linux shell腳本下最常用的行編輯器;
1.1、sed編輯器
流編輯器(stream editor),與普通的交互式文本編輯器相對應。
sed命令每次在內存中處理一行數據,然後保存到硬盤中,或者輸出到顯示器。
sed編輯器的使用格式:sed options script file
常用選項如下圖:
1、在命令行中定義編輯器命令
用於STDIN輸入流:
$ echo "This is a test" | sed ‘s/test/big test/‘
This is a big test
s 命令,用於替換,將前面匹配到的test 替換為 big test;
可以以直接對文本進行處理:
註意,它值修改顯示內容,但是文本原來的內容它並不修改;此時,你去cat data1還是原來的數據;
2、在命令行中使用多個編輯器命令
通過 -e 選項使得 sed 命令能夠執行多個選項
$ sed -s ‘s/brown/green/; s/dog/cat/‘ data1
使用次級提示符來輸入這個命令也可以;
$ sed -e ‘
> s/brown/green/
> s/for/elephant/
> s/dog/cat/‘ data1
3、從文件讀取編輯器命令
如果太多的sed命令要處理,可以將命令保存在文件中,然後在執行即可,這時候使用 -f 的參數就可以了;
1.2、gawk程序
sed命令有自己的局限性。一個能夠提供類似於編輯環境的工具,它容許修改和重新組織文件中的數據。這正是gawk的特長。
gawk程序是Unix中源awk程序的gnu版本。awk程序在流編輯方面比sed編輯器更先進的是:它提供了一種編輯語言而不僅僅是編輯器命令行。在編程語言內部,可以:
定義要保存數據的變量
使用算術和字符串操作符對數據進行運算
使用接過話編程概念,例如if-then語句和循環,將邏輯添加到數據處理過程
通過從數據文件內抽取數據元素以及按照其他順序或格式對它們重定位,生成帶格式的報告
1、gawk命令格式
基本格式:gawk options program file
gawk的選項如下:
2、自命令行讀取程序腳本
gawk的程序由 { } 來定義。例如:
$ gawk ‘{print "Hell John!"}‘
print 命令執行打印功能,將文本輸出到STDOUT;
如果要結束gawk程序,必須信號說明數據流已經結束。bash shel中Ctrl + D組合生成EOF字符。終止命令運行,返回到命令行;
3、使用數據字段變量
gawk主要作用就是處理數據。它是通過自動將變量分配給每行中的每個數據元素實現這一功能的。
$0 代表整行文本
$1 表示文本行中的第一個數據字段
$2 表示文本行中的第二數據字段
$n 表示文本匯總第n個數據段
個數據之間通過字段分隔符來確定。-F 可以指定字段分隔符;
-F 指定字段分隔符
$ gawk -F: ‘{print $1}‘ /etc/passwd
4、在程序腳本匯總使用多個命令
多個命令之間用分號隔開就可以了
$ echo "My name is Rich" | gawk ‘{$4="Dave"; print $0}‘
第一個命令時給$4指定一個字段Dave,之後打印整行
5、從文件讀取程序
從文件中引用命令
$ cat script2
{ print $5 "‘s userid is " $1 }
$ gawk -F: -f script2 /etc/passwd
如果腳本中有多條命令,使用分號隔開就可以,如果不想使用分號,則從起一行即可;
6、處理數據之前運行腳本
gawk指定腳本運行的時間。BIGIN關鍵字,讓gawk可以強制讀取數據之前,執行BIGIN關鍵字之後的腳本程序:
$ gawk ‘BEGIN {print "Hello World!"}‘
Hello World
在顯示完數據後,就會立刻退出,不會再讀取需要執行的文件;
$ gawk ‘BEGIN {print "Hello World!"} {print $0}‘
這樣的話,就會執行第二段數據;要退出的話,就執行ctrl + D就行;
7、在處理數據之後運行腳本
與BEGIN一樣,END關鍵字容許指定在讀取的數據之後,gawk執行程序腳本
$ gawk ‘BEGIN {print "Hello World!"} {print $0} END {print "byebye"}‘
在使用ctrl + D之後,依然運行END關鍵字後面的命令;
可以將這些小功能集合起來,寫一個小功能:
BEGIN { print "The latest list of users and shells" print " Userid Shell" print "-------- ------" FS=":" #指定分隔符 } { print $1 " " $7 } END { print "This concludes the listing" }
使用這個腳本:
$ gawk -f script4 /etc/passwd
2、sed編輯器基礎知識
成功使用sed編輯器的關鍵是要了解其大量的命令和格式,這些命令和格式優租寓自定義文本編輯。
2.1、更多的替換選項
s 命令用於文本替換,其他幾個選項也可以實現替換
1、替換標記
默認 s 只能替換一行中第一個數據
$ sde ‘s/test/trial/‘ data4
要想全部替換,必須使用替換標記。 s/pattern/replacement/flags
替換標記有四種:1、數字:表示新文本替換的模式;2、g:表示用心文本替換現有文本全部實力;3:、p:表示打印原始行的內容;4、w file:將替換結果寫入文件
例如:
指定第二個匹配字符串進行替換
例如:
將所有的test替換為trial
p 替換標記會打印包含替換命令中匹配模式的那一行。進場和 -n sed選項一起使用:
-n 表示禁止sed編輯器的輸出。然而,p則是打印替換行。二則結合使用僅生成替換行;
w將文本保存到另一文件中;
2、替換字符
$ sed ‘s/\/bin\/bash/\/bin\/csh/‘ /etc/passwd
使用太多的轉意字符,容易出錯
$ sed ‘s!/bin/bash!/bin/csh!‘ /etc/passwd
2.2、使用地址
尋找文本中的特定行進行編輯,有兩種方式:1、行的數值範圍;2、篩選行的文本模式。
[address] command
多行組合在一起:
address {
command1
command2
command3
}
1、數字式行尋址
$ sed ‘2s/dog/cat/‘ data1 #就替換第二行的數據
$ sed ‘2,3s/dog/cat/‘ data1 #替換第二行和第三行的數據
$ sed ‘2,$s/dog/cat/‘ data1 #替換第二行到最後行的數據
2、是用根本模式篩選
命令格式:/pattern/command
$ sed ‘/rich/s/bash/csh/‘ /etc/passwd #將rich字符串行找出,並將其bash替換為csh
記住sed命令時支持正則表達式的,pattern部分是可以使用正則表達式來完成;
3、組合命令
如果需要在單獨行上執行多個命令,請使用大括號將命令組和在一起;
2.3、刪除行
d 命令給出刪除操作;
$ sed ‘3d‘ data6 #刪除第3行
$ sed ‘2,3d‘ data6 #刪除第二行和第三行
$ sed ‘3,$d‘ data6 #刪除第三行到最後行
$ sed ‘/number 1/d‘ data6 #匹配number字符串的行的第一行刪除掉
2.4、插入和附加文本
sed 也可以插入和附加文本。1、插入命令(i)在自定行之前添加新行;2、附加命令(a)在指定行之後添加新的一行;
用法:
sed ‘[address]command\
new line‘
$ echo "testing" | sed ‘i\
> this is a test‘
$ echo "testing" | sed ‘a\
> this is a test‘
上面兩條命令時有區別的;
在第三行的後一行中添加“This is an inserted line.”
$符號表示最後一行,在最後行的後面添加新的內容;
2.5、更改行
c 更改命令,更改文本數據流中的所有文本內容。
將第三行替換為指定內容
也可以指定文本內容,和“刪除”操作一樣:
$ sed ‘/number 3/c\
> This is a changed line of test.‘ data6
也可以基於範圍來替換:
$ sed ‘2,3c\
> This a changed line of test.‘ data6
2.6、變換命令
變換命令(y)是唯一對單個字符進行操作的sed編輯器命令。變換命令使用格式:
[address]y/inchars/outchars/
$ sed ‘y/123/789/‘ data7 #將文本中的1、2、3字符,替換為 7、8、9 一一匹配。
$ echo "This 1 is a test of 1 try." | sed ‘y/123/456/‘
This 4 is a test of 4 try.
2.7、打印命令溫習
打印來自數據流的信息:1、小寫p;2、打印行號 = 命令;3、列出行的 l 命令;
1、打印行
$ echo "this is a test" | sed ‘p‘
$ sed -n ‘/number 3/p‘ data6 #-n禁止其他行的顯示
This is line number 3.
$ sed -n ‘2,3p‘ data6
This is line number2.
This is line number3.
2、打印行號
$ sed ‘=‘ data1
1
The quick brown fox jumps over the lazy dog.
2
The quick brown fox jumps over the lazy dog.
$ sed -n ‘/nmuber 4/{
=
p
}‘ data6 #選出一行的命令
3、列出行
字表符\t會直接打印出來
直接顯示顏色轉意控制符;
2.8、將文件用於sed
1、寫文件
w 命令將文本行寫入新的文件中,格式:[address]w filename
如果向基於常見文本值從文本文件創建一個數據文件,這是一個很好的工具。
2、從文件讀取數據
r命令容許您插入包含在獨立文件中的數據。命令格式:[address]r filename
$ sed ‘3r data11‘ data6 #在data6文本的第三行下面插入data11的內容
$ sed ‘/number 2/r data11‘ data6 #在data6文本的匹配的字符number第二行下面插入data11文本內容
$ sed ‘$r data11‘ data6 #在data6文本的最後一行插入data11文本內容
sed和gawk