1、什麼是sed
sed = Stream EDitor 行編輯器 (全屏編輯器: vi)
2、模式空間
sed默認不對源文件的數據進行處理,而是處理模式空間中的數據,處理結束後,在將模式空間顯示到屏幕上。
3、sed命令的用法:
sed [options] 'AddressCommond' file1,file2......
-n :靜默模式,不再顯示模式空間中的內容
-e Script -e Script : 可以同時執行多個腳本
-i :直接修改原文件中的內容
-r :表示使用擴展的正則表達式
-f /path/to/script file
4、address:
1、startLine,EndLine
eg:1,100
$表示最後一行
2、/RegExp/
eg:/root/
3、/pattern1/,/pattern2/
從第一次被pattern1匹配到的行開始,到第一次被pattern2匹配到的行結束,這中間的所有行
4、LineNumber
指定的行
5、StartLine,+N
從指定的行開始,向後的N行,包括StartLine
5、Commond:
d:刪除符合條件的行
p:顯示符合條件的行
a \string:在指定行的行尾追加新行,添加的內容爲string
i \string:在指定行的行首添加新行,添加的內容爲string
r FILE:將指定文件的內容添加到符合條件的行處
w FILE: 將地址指定的範圍內的行另存至指定的文件中;
s/pattern/string/修飾符: 查找並替換,默認只替換每行中第一次被模式匹配到的字符串
加修飾符
g: 全局替換
i: 忽略字符大小寫
s///: s###, s@@@
\(\), \1, \2
l..e: like-->liker
love-->lover
like-->Like
love-->Love
&: 引用模式匹配整個串
sed練習:
1、刪除/etc/grub.conf文件中行首的空白符;
sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf
2、替換/etc/inittab文件中"id:3:initdefault:"一行中的數字爲5;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
3、刪除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
4、刪除/etc/inittab文件中開頭的#號;
sed 's@^#@@g' /etc/inittab
5、刪除某文件中開頭的#號及後面的空白字符,但要求#號後面必須有空白字符;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6、刪除某文件中以空白字符後面跟#類的行中的開頭的空白字符及#
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7、取出一個文件路徑的目錄名稱;
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
基名:
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g'
#abc
# hello world
# hi world
練習:
傳遞一個用戶名參數給腳本,判斷此用戶的用戶名跟其基本組的組名是否一致,並將結果顯示出來。
if ! id $1 &> /dev/null;then
echo "No Such User"
exit 10
fi
if [ `id -u -n $1` == `id -g -n $1`];then
echo "Yi Yang"
else
echo "Bu Yi Yang"
fi
字符測試:
==:測試是否相等,相等爲真,不等爲假
!=: 測試是否不等,不等爲真,等爲假
>
<
-n string: 測試指定字符串是否爲空,空則真,不空則假
-z string: 測試指定字符串是否不空,不空爲真,空則爲假
練習:寫一個腳本
傳遞一個參數(單字符就行)給腳本,如參數爲q,就退出腳本;否則,就顯示用戶的參數;
練習:寫一個腳本
傳遞一個參數(單字符就行)給腳本,如參數爲q、Q、quit或Quit,就退出腳本;否則,就顯示用戶的參數;
#!/bin/bash
#
if [ $1 = 'q' ];then
echo "Quiting..."
exit 1
elif [ $1 = 'Q' ];then
echo "Quiting..."
exit 2
elif [ $1 = 'quit' ];then
echo "Quiting..."
exit 3
elif [ $1 = 'Quit' ];then
echo "Quiting..."
exit 4
else
echo $1
fi
練習:
傳遞三個參數給腳本,第一個爲整數,第二個爲算術運算符,第三個爲整數,將計算結果顯示出來,要求保留兩位精度。形如:
./calc.sh 5 / 2
#!/bin/bash
RESULT=`bc <<< "scale=2;$1$2$3"`
echo RESULT
練習:
傳遞3個參數給腳本,參數均爲用戶名。將此些用戶的帳號信息提取出來後放置於/tmp/testusers.txt文件中,並要求每一行行首有行號。
寫一個腳本:
判斷當前主機的CPU生產商,其信息在/proc/cpuinfo文件中vendor id一行中。
如果其生產商爲AuthenticAMD,就顯示其爲AMD公司;
如果其生產商爲GenuineIntel,就顯示其爲Intel公司;
否則,就說其爲非主流公司;
寫一個腳本:
給腳本傳遞三個整數,判斷其中的最大數和最小數,並顯示出來。
MAX=0
MAX -eq $1
MAX=$1
MAX -lt $2
MAX=$2