Centos7.5-expect-正則表示式-sed-cut的使用
本節所講內容:
- 23.1 expect實現無互動登入
- 23.2 正則表示式
- 23.3 sed流編輯器
- 23.4 cut命令
- 23.5 實戰-bash指令碼語法檢查和檢視詳細的執行過程
23.1 expect實現無互動登入
expect ([ɪkˈspekt] 期待 )是從它發展出來的。如果你想要寫一個能夠自動處理輸入輸出的指令碼(如向用戶提問並且驗證密碼)又不想面對C或者Perl,那麼expect是你的最好的選擇。它可以用來做一些linux下無法做到互動的一些命令操作 23.1.1 安裝和使用expect
[[email protected] ~]# yum -y install expect 使用expect建立指令碼的方法
1)定義指令碼執行的shell
#!/usr/bin/expect
這裡定義的是expect可執行檔案的連結路徑(或真實路徑),功能類似於bash等shell功能
2)set timeout 30
設定超時時間,單位是秒,如果設為timeout -1 意為永不超時
3)spawn
spawn 是進入expect環境後才能執行的內部命令,如果沒有裝expect或者直接在預設的SHELL下執行是找不到spawn命令的。不能直接在預設的shell環境中進行執行主要功能,它主要的功能是給ssh執行程序加個殼,用來傳遞互動指令。
4)expect
這裡的expect同樣是expect的內部命令 主要功能:判斷輸出結果是否包含某項字串,沒有則立即返回,否則就等待一段時間後返回,等待時間通過timeout進行設定
5)send
執行互動動作,將互動要執行的動作進行輸入給互動指令
命令字串結尾要加上"\r",如果出現異常等待的狀態可以進行核查
6)exp_continue
繼續執行接下來的互動操作
7)interact
執行完後保持互動狀態,把控制權交給控制檯;如果不加這一項,互動完成會自動退出
8)$argv
expect 指令碼可以接受從bash傳遞過來的引數,可以使用 [lindex $argv n]獲得,n從0開始,分別表示第一個,第二個,第三個……引數
例1:免密碼通過SSH登入伺服器(瞭解) 這裡不是用金鑰 注:執行指令碼時,要把#號後面的註釋刪除,不然無法執行
[[email protected] ~]# cat ssh.exp
#!/usr/bin/expect
set ipaddr "192.168.1.63"
set name "root"
set passwd "123456"
set timeout 30 #設定超時時間,單位是秒;expect超時等待的時間。預設timeout為10s。
spawn ssh [email protected]$ipaddr # spawn是進入expect環境後才可以執行的expect內部命令,如果沒有裝expect或者直接在shell下執行是找不到spawn命令的。這個就好比cd是shell的內建命令,離開shell,就無法執行cd一樣。 它主要的功能是給ssh執行程序加個殼,用來傳遞互動指令。
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" } #執行互動動作,與手工輸入密碼的動作等效。
}
expect "#" #判斷上次輸出結果裡是否包含“password:”的字串,如果有則立即返回,向下執行;否則就一直等待,直到超時時間到
send "touch /root/xuegod1011.txt\r"
send "ls /etc > /root/xuegod1011.txt\r"
send "mkdir /tmp/xuegod1011\r"
send "exit\r"
expect eof #執行完成上述命令後,退出Expect,把控制權交給控制檯,變回手工操作
[[email protected] ~]# expect ssh.exp #開始執行
例2:對伺服器批量管理(瞭解一下)
[[email protected] ~]# cat ip_pass.txt #這裡寫上要執行的IP地址和root使用者密碼
192.168.1.63 123456
192.168.1.63 123456
192.168.1.63 123456
[[email protected] ~]# cat ssh2.exp #編寫要執行的操作
#!/usr/bin/expect
set ipaddr [lindex $argv 0]
set passwd [lindex $argv 1]
set timeout 30
spawn ssh [email protected]$ipaddr
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }
}
expect "#"
send "touch /root/xuegod1011.txt\r"
send "ls /etc > /root/xuegod1011.txt\r"
send "mkdir /tmp/xuegod1011\r"
send "exit\r"
expect eof
[[email protected] ~]# cat login.sh #開始執行
#!/bin/bash
echo
for ip in `awk '{print $1}' /root/ip_pass.txt`
do
pass=`grep $ip /root/ip_pass.txt|awk '{print $2}'`
expect /root/ssh.exp $ip $pass
done
Linux架構師高薪入口: 1.學神IT教育官方網站: http://xuegod.ke.qq.com 2.10年行業資深老鳥MK:QQ2659153446 3.加入Linux技術交流QQ群:722287089,即可獲得以下福利: ①定期分享免費學習資料與視訊(工具+筆記+拓展實戰) ②10年行業資深老鳥線上答疑:技能+實戰+專案分享+高薪就業 ③有機會免費領取Linux雲端計算叢集架構師4冊書籍
23.2 正則表示式的使用
正則表示式,又稱規則表示式。(英語:Regular Expression [ˈreɡjulə] 規則的 [ iksˈpreʃən] 表達 ),在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。 正則表示式不只有一種,而且LINUX中不同的程式可能會使用不同的正則表示式,如:
工具:grep sed awk
LINUX中常用的有兩種正則表示式引擎
基礎正則表示式:BRE
擴充套件正則表示式: ERE
23.2.1 Shell正則表示式的組成
基礎正則表示式
特別字元 描述
$ 匹配輸入字串的結尾位置。要匹配 $ 字元本身,請使用 \$
( ) 標記一個子表示式的開始和結束位置。要匹配這些字元,請使用 \( 和 \)
* 匹配前面的子表示式零次或多次。要匹配 * 字元,請使用 \*
+ 匹配前面的子表示式一次或多次。要匹配 + 字元,請使用 \+
. 匹配除換行符 \n 之外的任何單字元。要匹配 . ,請使用 \.
[ 標記一箇中括號表示式的開始。要匹配 [,請使用 \[
? 匹配前面的子表示式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字元,請使用 \?
\ 將下一個字元標記為或特殊字元、或原義字元、或向後引用、或八進位制轉義符。例如, 'n' 匹配字元 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("
^ 匹配輸入字串的開始位置,除非在方括號表示式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用 \^
{ 標記限定符表示式的開始。要匹配 {,請使用 \{
| 指明兩項之間的一個選擇。要匹配 |,請使用 \| 如: Y | y
定位符
^ 匹配輸入字串開始的位置
$ 匹配輸入字串結尾的位置
非列印字元
\n 匹配一個換行符
\r 匹配一個回車符
\t 匹配一個製表符
例:統計/etc/ssh/sshd_config檔案中除去空行和#號開頭的行的行數
[[email protected] ~]# grep -v "^$\|^#" /etc/ssh/sshd_config #使用基礎正則表示式
[[email protected] ~]# grep -E -v "^$|^#" /etc/ssh/sshd_config #擴充套件正則表示式
[[email protected] ~]# egrep -v "^$|^#" /etc/ssh/sshd_config #擴充套件正則表示式
例2:點字元
[[email protected] ~]# grep .ot /etc/passwd #查詢passwd檔案包括.ot 的字元
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin
23.3 sed流編輯器 23.3.1 sed strem editor 流編輯器
-
sed編輯器是一行一行的處理檔案內容的。正在處理的內容存放在模式空間(緩衝區)內,處理完成後按照選項的規定進行輸出或檔案的修改。
-
接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重定向儲存輸出。Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反覆操作;
sed也是支援正則表示式的,如果要使用擴充套件正則加引數-r sed的執行過程:
1、 一次讀取一行資料
2、 根據我們提供的規則來匹配相關的資料,比如查詢root。
3、 按照命令修改資料流中的資料,比如替換
4、 將結果進行輸出
5、 重複上面四步
23.3.2 如何使用
語法格式:sed [options] ‘[commands]’ filename 例1:
[[email protected] ~]# echo "this is aplle" | sed 's/aplle/dog/'
this is dog
[[email protected] ~]# echo "this is aplle" > a.txt
[[email protected] ~]# sed 's/apple/dog/' a.txt
this is aplle
[[email protected] ~]# cat a.txt #發現並沒有修改檔案
this is aplle
23.3.3 sed選項|引數
options:
-a 在當前行下面插入檔案
-n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令
-e 執行多個sed指令
-f 執行指令碼
-i 編輯檔案內容 ***
-i.bak 編輯的同時創造.bak的備份
-r 使用擴充套件的正則表示式
命令:
i 在當前行上面插入檔案 c 把選定的行改為新的指定的文字 p 列印 *** d 刪除 *** r/R 讀取檔案/一行 w 另存 s 查詢 y 替換 h 拷貝模板塊的內容到記憶體中的緩衝區。 H 追加模板塊的內容到記憶體中的緩衝區。 g 獲得記憶體緩衝區的內容,並替代當前模板塊中的文字。 G 獲得記憶體緩衝區的內容,並追加到當前模板塊文字的後面 D 刪除\n之前的內容 P 列印\n之前的內容
替換標記:
數字:表明新文字將替換第幾處模式匹配的地方
g:表示新文字將會替換所有匹配的文字
\1:子串匹配標記,前面搜尋可以用元字符集\(..\),
&:保留搜尋到的字元用來替換其它字元
sed匹配字符集
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。
. 匹配一個非換行符的任意字元,如:/s.d/匹配s後接一個任意字元,最後是d。
* 匹配0個或多個字元,如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。
例1:s 只替換第一個匹配到的字元,將passwd中的root使用者替換成xuegod
[[email protected] ~]# sed 's/root/xuegod/' /etc/passwd
xuegod:x:0:0:root:/root:/bin/bash #發現只替換了第一個匹配的root,後面的沒有替換
bin:x:1:1:bin:/bin:/sbin/nologin
例2:全面替換標記g
[[email protected] ~]# sed 's/root/xuegod/g' /etc/passwd |more
xuegod:x:0:0:xuegod:/xuegod:/bin/bash #全部替換了
例2: 將sed中預設的/ 定界符改成#號
[[email protected] ~]# sed 's#/bin/bash#/sbin/nologin#' /etc/passwd | more
root:x:0:0:root:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
以/來做定界符:
[[email protected] ~]# sed 's/\/bin\/bash/\/sbin\/nologin/' /etc/passwd
(2)按行查詢替換 寫法如下:
用數字表示行範圍;$表示行尾
用文字模式配置來過濾
例1:單行替換,將第2行中bin替換成xuegod
[[email protected] ~]# sed '2s/bin/xuegod/' /etc/passwd | more
root:x:0:0:root:/root:/bin/bash
xuegod:x:1:1:bin:/bin:/sbin/nologin
例2:多行替換,如果涉及到多行處理,用逗號表示行間隔。 將第3行到最行尾中bin替換成xuegod
[[email protected] ~]# sed '2,$s/bin/xuegod/' /etc/passwd | more
root:x:0:0:root:/root:/bin/bash
xuegod:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sxuegod:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sxuegod/nologin
(3)d 刪除第2行到第4行的內容
[[email protected] ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 xuegod63.cn
192.168.1.64 xuegod64.cn
192.168.1.62 xuegod62.cn
[[email protected] ~]# sed '2,4d' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.62 xuegod62.cn
[[email protected] ~]# sed '/192.168/d' /etc/hosts #將包括192.168的行刪除
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
(4)新增行
命令i(insert插入),在當前行前面插入一行 i\
命令a(append附加),在當前行後面新增一行 a\
例1:插入
[[email protected] ~]# echo "hello world" | sed 'i\ xuegod '
xuegod
hello world
例2:追加
[[email protected] ~]# echo "hello world"|sed 'a\xuegod'
hello world
xuegod
例3:在檔案最後追加內容
[[email protected] ~]# sed '$a\192.168.1.65 xuegod65.cn' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 xuegod63.cn
192.168.1.64 xuegod64.cn
192.168.1.62 xuegod62.cn
192.168.1.65 xuegod65.cn
例4:在檔案中第2行之後,開始追加內容
[[email protected] ~]# sed '2a\192.168.1.65 xuegod65.cn' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.65 xuegod65.cn
192.168.1.63 xuegod63.cn
192.168.1.64 xuegod64.cn
192.168.1.62 xuegod62.cn
例5:在檔案中第2行到第4行之後分別追加內容
[[email protected] ~]# sed '2,4a\hello world' word1.txt
[[email protected] ~]# sed '2,4a\192.168.1.65 xuegod65.cn' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.65 xuegod65.cn
192.168.1.63 xuegod63.cn
192.168.1.65 xuegod65.cn
192.168.1.64 xuegod64.cn
192.168.1.65 xuegod65.cn
192.168.1.62 xuegod62.cn
*(5)修改行命令c (change) c* 例1:將第4行內容改成192.168.1.65 xuegod65.cn
[[email protected] ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 xuegod63.cn
192.168.1.64 xuegod64.cn
192.168.1.62 xuegod62.cn
[[email protected] ~]# sed '4c\192.168.1.65 xuegod65.cn' /etc/hosts
例2:將第2行到最後全部修改成192.168.1.65 xuegod65.cn
[[email protected] ~]# sed '2,$c\192.168.1.65 xuegod65.cn' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.65 xuegod65.cn
例3:將包括192.168.1.64行的內容修改成192.168.1.65
[[email protected] ~]# sed '/192.168.1.64/c\192.168.1.65' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 xuegod63.cn
192.168.1.65
192.168.1.62 xuegod62.cn
(6)列印,直接輸入檔案中的內容 例1:輸入第2行內容
[[email protected] ~]# sed -n '2p' /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
(7)將修改或過濾出來的內容儲存到另一個檔案中 例2:將passwd中的包括root字樣的行儲存到 c.txt 中
[[email protected] ~]# sed -n '/root/w c.txt' /etc/passwd
[[email protected] ~]# cat c.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
(8)-i 對原檔案修改,儲存( 必會 ) 使用場景: 替換或修改伺服器配置檔案
[[email protected] ~]# cp /etc/passwd /opt/
[[email protected] ~]# sed -i 's/root/xuegod/' /etc/passwd
[[email protected] ~]# head -n 1 /etc/passwd
xuegod:x:0:0:root:/root:/bin/bash
修改IP地址為192.168.1.65
[[email protected] ~]# sed -i 's/IPADDR=192.168.1.63/IPADDR=192.168.1.65/' /etc/sysconfig/network-scripts/ifcfg-ens33
Linux架構師高薪入口: 1.學神IT教育官方網站: http://xuegod.ke.qq.com 2.10年行業資深老鳥MK:QQ2659153446 3.加入Linux技術交流QQ群:722287089,即可獲得以下福利: ①定期分享免費學習資料與視訊(工具+筆記+拓展實戰) ②10年行業資深老鳥線上答疑:技能+實戰+專案分享+高薪就業 ③有機會免費領取Linux雲端計算叢集架構師4冊書籍
微信公眾號: MK老師微訊號: 23.4 cut命令 23.4.1 cut常用引數
cut命令用來顯示行中的指定部分,刪除檔案中指定欄位。
- 說明:該命令有兩項功能,其一是用來顯示檔案的內容,它依次讀取由引數file所指明的檔案,將它們的內容輸出到標準輸出上;其二是連線兩個或多個檔案,如cut fl f2 > f3將把檔案fl和fn的內容合併起來,然後通過輸出重定向符“>”的作用,將它們放入檔案f3中。
語法: cut(選項)(引數) 選項
-b:僅顯示行中指定範圍的位元組數;
-c:僅顯示行中指定範圍的字元;
-d:指定欄位的分隔符,預設的欄位分隔符為“TAB”;
-f:顯示指定欄位的內容;
例1:輸出系統中所有使用者名稱
使用 -f 選項提取指定欄位,使用 -d 選項指定欄位分隔符,這裡以:冒號做分隔
[[email protected] ~]# cut -f1 -d ":" /etc/passwd
23.4.2 cut命令可以將一串字元作為列來顯示,字元欄位的記法:
N-:從第N個位元組、字元、欄位到結尾;
N-M:從第N個位元組、字元、欄位到第M個(包括M在內)位元組、字元、欄位;
-M:從第1個位元組、字元、欄位到第M個(包括M在內)位元組、字元、欄位。
上面是記法,結合下面選項將摸個範圍的位元組、字元指定為欄位:
-b 表示位元組;
-c 表示字元;
-f 表示定義欄位。
示例
例1:列印第1個到第3個字元:
[[email protected] ~]# cut -c1-3 /etc/passwd
例2:列印前2個字元:
[[email protected] ~]# cut -c-2 /etc/passwd
例3:列印從第5個字元開始到結尾:
[[email protected] ~]# cut -c5- /etc/passwd
Linux架構師高薪入口: 1.學神IT教育官方網站: http://xuegod.ke.qq.com 2.10年行業資深老鳥MK:QQ2659153446 3.加入Linux技術交流QQ群:722287089,即可獲得以下福利: ①定期分享免費學習資料與視訊(工具+筆記+拓展實戰) ②10年行業資深老鳥線上答疑:技能+實戰+專案分享+高薪就業 ③有機會免費領取Linux雲端計算叢集架構師4冊書籍
23.5 實戰-bash指令碼語法檢查和檢視詳細的執行過程
檢查語法是否有錯:
bash -v test.bash #檢視bash是否存在語法錯誤
bash -x test.bash #檢視bash詳細的執行過程
[[email protected] ~]# cat a.sh
# Script to show debug of shell
#
tot=`expr $1 + $2`
secho $tot #這裡故意寫錯
[[email protected] ~]# bash -v a.sh
# Script to show debug of shell
#
tot=`expr $1 + $2`
expr: 語法錯誤 #語法哪錯了? 執行時沒有給引數
secho $tot #這裡故意寫錯
a.sh:行4: secho: 未找到命令
[[email protected] ~]# sed -i 's/secho/echo/' a.sh #修改正確後
[[email protected] ~]# bash -x a.sh 2 3 #檢視詳細執行過程。 注:這個指令碼是真正執行一遍,不是預執行
++ expr 2 + 3
+ tot=5
+ echo 5
**例2:檢視九九乘法表shell指令碼執行過程**
[[email protected] ~]# cat 99.sh
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$i*$j= `echo $(($i*$j))` "
done
echo " "
done
[email protected] ~]# bash -x 99.sh
Linux架構師高薪入口: 1.學神IT教育官方網站: http://xuegod.ke.qq.com 2.10年行業資深老鳥MK:QQ2659153446 3.加入Linux技術交流QQ群:722287089,即可獲得以下福利: ①定期分享免費學習資料與視訊(工具+筆記+拓展實戰) ②10年行業資深老鳥線上答疑:技能+實戰+專案分享+高薪就業 ③有機會免費領取Linux雲端計算叢集架構師4冊書籍
微信公眾號: MK老師微訊號: 總結:
- 23.1 expect實現無互動登入
- 23.2 正則表示式
- 23.3 sed流編輯器
- 23.4 cut命令
- 23.5 實戰-bash指令碼語法檢查和檢視詳細的執行過程