Linux命令行與shell腳本編程大全中關於sed和gawk的介紹合在一塊兒,並且結構有點亂。shell
不像以前的命令寫的很清楚。因此此次我須要寫下來整理一下。編程
sed option script filebash
s/pattern/replacement/flags 替換命令,flags包括:數字(行號),g(替換全部),p(打印原先內容),w file(寫進文件)編程語言
例子:編輯器
sed 's/test/trial/' data4.txt sed 's/test/trial/2' data4.txt sed 's/test/trial/g' data4.txt sed -n 's/test/trial/p' data4.txt sed 's/test/trial/w test.txt' data5.txt
而後,s指令,又能夠指定地址,格式以下:ide
[address]command 或者大數據
address {this
command1spa
command2命令行
command3
}
或者直接用/pattern/command,匹配出須要的部分,再操做。
使用例子:
sed '2s/dog/cat/' data1.txt sed '2,3s/dog/cat/' data1.txt sed '2,$s/dog/cat/' data1.txt sed '/Samantha/s/bash/csh/' /etc/passwd sed '2{ s/fox/elephant/ s/dog/cat/ }' data1.txt sed '3,${ s/brown/green/ s/lazy/active/ }' data1.txt
和s相似,直接例子吧
sed '3d' data6.txt sed '2,3d' data6.txt sed '3,$d' test6.txt sed '/number 1/d' data6.txt
插入命令(i),在指定行前加一個新行
附加命令(a),在指定行後加一個新行
sed '[address] command\ new line'
例子:
echo "Test Line 2" | sed 'i\ Test Line 1' echo "Test Line 2" | sed 'a\Test Line 1'
命令c相似於插入和附加,直接上例子吧
sed '3c\This is a changed line of text.' data6.txt sed '/number 3/c\This is a changed line of text.' data6.txt
轉換命令(y)是惟一能夠處理單個字符的sed編輯器命令
[address]y/inchars/outchars/
例子:
sed 'y/123/789/' data8.txt data8中全部123換成789,一一對應
例子:
echo "this is a test" | sed 'p' sed -n '/number 3/p' data6.txt sed -n '2,3p' data6.txt sed -n '/3/{ p s/line/test/p }' data6.txt sed '=' data1.txt sed -n '/number 4/{ = p }' data6.txt sed -n 'l' data9.txt
寫入文件用命令(w),[address]w filename
讀取數據用命令(r),[address]r filename
例子:
sed -n '/Browncoat/w Browncoats.txt' data11.txt sed '3r data12.txt' data6.txt sed '/number 2/r data12.txt' data6.txt sed '$r data12.txt' data6.txt
gawk提供了一種編程語言,能夠作下面的事情:
定義變量來保存數據:
gawk options program file
可用選項:
-F fs 指定行中劃分數據字段的字段分隔符
-f file 從指定的文件中讀取程序
-v var=value 定義gawk程序中的一個變量及其默認值
-mf N 指定要處理的數據文件中的最大字段數
-mr N 指定數據文件中的最大數據行數
-W keyword 指定gawk的兼容模式或警告等級
gawk會從STDIN接收數據,並處理而後打印到STDOUT。
只要在命令之間放個分號便可,組成多命令。
echo "My name is Rich" | gawk '{$4="Christine"; print $0}'
關鍵字:BEGIN、END
gawk 'BEGIN {print "The data3 File Contents:"} {print $0} END {print "End of File"}' data3.txt