sed、awk和grep被稱爲Linux的三劍客,本文主要講述sed和awk的基本應用,關於grep和正則表達式的應用,請移步本人的另一篇博文,連接爲 http://wangfeng7399.blog.51cto.com/3518031/1360804
1、sed
1)sed簡介
sed的全稱爲stream editor,sed在處理時一次只讀取文件的一行並對這一行進行處理,而且sed將處理後的數據只會顯示在屏幕上,並不會對原文件進行修改,因此說sed是一個行編輯器
2)sed的使用格式
sed [options] "script" FILE....
3)詳解各選項與編輯命令的使用
選項:
-n:靜默模式,不輸出模式空間內的內容,默認打印空間模式內的內容
-r:擴展的正則表達式
-f 文件:指定sed腳本文件
-i:直接編輯源文件
編輯命令
d:刪除
p:打印
i \:在被指定到的行前面插入文本
a \:在被指定到的行下面插入文本
r 文件路徑:在指定的位置插入另一個文件的內容
w 文件路徑:將符合條件的全部行保存至指定的文件中
= 顯示符合條件的所在行的行號
s@@@:查找條件也可使用模式,可是被替換的內容不能使用模式
使用格式:
sed '地址定界s@查找條件@替換後的文本@修飾符
地址定界:自定義的起始行到結束行,默認爲全文
有三種方式表示
startline,endline
/pat1/,/pat2/
/pattern/
用法:sed [options] 'addr1[,addr2]編輯命令'FILE...
sed [options] "addr1[,addr2]編輯命令"FILE...
sed在作替換時還支持正則表達式,正則表達式的使用本處不作講解。
修飾符:
g:global,全局替換
i:ignore-case,不區分字符大小寫
4)練習
1)替換/etc/inittab文件中」id:3:initdefault:"一行中的數字爲5
linux
sed 's@\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab
2)刪除/etc/init.d/funcions文件中的空白行
正則表達式
sed "/^$/d" /etc/init.d/funcions
3)刪除/etc/inittab文件中位於行首的#;
shell
sed 's@^#@@g' /etc/inittab
4)刪除/etc/rc.d/rc.sysinit文件中以#後跟至少一個空白字符開頭的行的行首的#和空白字符。
數組
sed "s@^#[[:space:]]\{1,\}\@@g" /etc/rc.d/rc.sysinit
5)刪除/boot/grub/grub.conf文件中行首的空白字符。
編輯器
sed "s@^[[:space:]]\{1,\}@@g" /boot/grub/grub.conf
6)取出一個文件路徑的目錄名稱,如/etc/sysconfig/network,其目錄爲/etc/sysconfig,功能相似dirname命令;
工具
echo /etc/sysconfig/network | sed "s@[^/]\{1,\}/\?$@@"
2、awk
1)簡介
awk是一個報告生成工具,旨在把文件中讀取到的每一行的每一個字段分別進行格式化,然後進行顯示,awk支持使用變量、條件判斷、循環、數組
如今linux系統上用到的都是gawk
2)格式:
awk [options] 'script'FILE....
awk [options] '/pattern/{action}'FILE...
3)選項與模式的使用
選項
-F:指定切割符,默認爲空白
$0:整行顯示
$1,$2.......:位置參數
模式
地址定界:
/pat1/,/pat2/,表示一個範圍
/pattern/,表示被匹配到的行
表達式
>,>=,<,<=,==,!=,~
BEGIN:表示在執行動做前要作的操做
END:表示在動做執行後的操做
awk的經常使用四種分隔符:
輸入:
行分隔符
字段分隔符
輸出:
行分隔符
字段分隔符
awk的內置變量
NF:最後一個字段
FS:指定輸入分隔符,在BEGIN中定義,至關於-F,默認爲空白
OFS:指定輸出時的分隔符,在BEGIN中定義,默認爲空白
4)練習
1.顯示GID小於500的組
spa
awk -F : '$3<500{print $1}' /etc/group
2.顯示默認的shell爲nologin的用戶
awk -F : '$7~/nologin$/{print $1}' /etc/passwd
3,顯示eth0網卡文件的配置信息,注意,只顯示等號後面的值
awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0
4.顯示/etc/sysctl。conf文件中定義的內核參數:只顯示名稱,
awk -F =' !/^#|^$/{print $1}'/etc/sysctl.conf
5.顯示eth0網卡的ip地址,經過ifconfig命令結果進行過濾
ifconfig eth0 |awk '/inet addr/{print $2}' |awk -F : '{print $2}'
code