1. 程式人生 > >Linux學習高階篇(四)

Linux學習高階篇(四)

1、正則表示式

1.1正則與萬用字元
  • 正則表示式用來在檔案中匹配符合條件的字串,正則是包含匹配grepawksed等命令可以支援正則表示式。
  • 萬用字元用來匹配符合條件的檔名,萬用字元是完全匹配lsfindcp這些命令不正則表示式,所以只能使用shell自己
的萬用字元來進行匹配了 。 1.2基礎正則表示式
元字元 作 用
* 前一個字元匹配0次或任意多次。
. 匹配除了換行符外任意一個字元。
^ 匹配行首。例如:^hello會匹配以hello開頭的行。
$ 匹配行尾。例如:hello&會匹配以hello結尾的行。
[] 匹配中括號中指定的任意一個字元,只匹配一個字元。
例如:
[aoeiu] 匹配任意一個母音字母[0-9] 匹配任意一位
數字, [a-z][0-9]匹配小寫字和一位數字構成的兩位字元。
[^] 匹配除中括號的字元以外的任意一個字元。例如:[^0-9]匹配
任意一位非數字字元,
[^a-z]
表示任意一位非小寫字母。
\ 轉義符。用於取消講特殊符號的含義取消。
\{n\} 表示其前面的字元恰好出現n次。例如:[0-9]\{4\}匹配4位數
字,
[1][3-8][0-9]\{9\} 匹配手機號碼。
\{n,\} 表示其前面的字元出現不小於n次。例如:[0-9]\{2,\}表示兩
位及以上的數字。
\{n,m\} 表示其前面的字元至少出現n次,最多出現m次。例如:[a
z]\{6,8\}
匹配68位的小寫字母。

2、字元擷取命令

2.1 cut欄位提取命令
[[email protected] ~]# cut [選項]檔名
選項:
-f 列號: 提取第幾列
-d 分隔符: 按照指定分隔符分割列

2.2  printf 命令 
printf 輸出型別輸出格式 輸出內容
輸出型別:
%ns:
輸出字串。n是數字指代輸出幾個字元
%ni: 輸出整數。n是數字指代輸出幾個數字

%m.nf: 輸出浮點數。mn是數字,指代輸出的整數位數和小數位數。如%8.2f代表共輸出8位數,其中2位是小數,6位是整數



輸出格式:
\a: 輸出警告聲音
\b: 輸出退格鍵,也就是
Backspace
\f: 清除螢幕
\n: 換行
\r: 回車,也就是
Enter
\t: 水平輸出退格鍵,也就是
Tab
\v: 垂直輸出退格鍵,也就是
Tab


2.3 awk命令
# awk ‘條件1{動作1}條件2{動作2}…’檔名
條件(Pattern):
一般使用關係表示式作為條件
x > 10 判斷變數 x是否大於10
x>=10 大於等於
x<=10 小於等於


2.4 sed命令

sed 是一種幾乎包括在所有UNIX平臺(包括 Linux)的輕量級流編輯器。sed主要是用來將資料進行選取、替換、刪除、新增的命令。

[[email protected] ~]# sed [選項] ‘[動作]’ 檔名
選項:
-n: 一般sed命令會把所有資料都輸出到螢幕 ,如果加入此選擇,則只會把經過sed命令處理的行輸出到螢幕。
-e: 允許對輸入資料應用多條sed命令編輯
-i: 用sed的修改結果直接修改讀取資料的檔案,而不是由螢幕輸出

動作:
a \: 追加,在當前行後新增一行或多行。新增多行時,除最後 一行外,每行末尾需要用“\”代表資料未完結。
c \: 行替換,用c後面的字串替換原資料行,替換多行時,除最後一行外,每行末尾需用“\”代表資料未完結。
i \: 插入,在當期行前插入一行或多行。插入多行時,除最後 一行外,每行末尾需要用“\”代表資料未完結。
d: 刪除,刪除指定的行。
p: 列印,輸出指定的行。
s: 字串替換,用一個字串替換另外一個字串。格式為“行範圍s/舊字串/新字串/g”(和vim中的替換格式類似)。

例如:檢視檔案的第二行 [[email protected] ~]# sed '2p' 檔名

3、字元處理命令

3.1排序命令sort

[[email protected] ~]# sort [選項] 檔名
選項:
-f: 忽略大小寫
-n: 以數值型進行排序,預設使用字串型排序
-r: 反向排序
-t: 指定分隔符,預設是分隔符是製表符
-k n[,m]: 按照指定的欄位範圍排序。從第n欄位開始,m欄位結束(預設到行尾)

#排序使用者資訊檔案
[[email protected] ~]# sort /etc/passwd
#反向排序
[[email protected] ~]# sort -r /etc/passwd
#指定分隔符是“:”,用第三欄位開頭,第三欄位結尾排序,就是隻用第三欄位排序
[[email protected] ~]# sort -t ":" -k 3,3 /etc/passwd

[[email protected] ~]# sort -n -t ":" -k 3,3 /etc/passwd

3.2統計命令wc

[[email protected] ~]# wc [選項] 檔名
選項:
-l: 只統計行數
-w: 只統計單詞數
-m: 只統計字元數

4、條件判斷

4.1按照檔案型別進行判斷

測試選項 作 用
-b 檔案 判斷該檔案是否存在,並且是否為塊裝置檔案(是塊裝置檔案
為真)
-c檔案 判斷該檔案是否存在,並且是否為字元裝置檔案(是字元裝置
檔案為真)
-d 檔案 判斷該檔案是否存在,並且是否為目錄檔案(是目錄為真)
-e 檔案 判斷該檔案是否存在(存在為真)
-f 檔案 判斷該檔案是否存在,並且是否為普通檔案(是普通檔案為真)
-L 檔案 判斷該檔案是否存在,並且是否為符號連結檔案(是符號連結
檔案為真)
-p 檔案 判斷該檔案是否存在,並且是否為管道檔案(是管道檔案為真)
-s 檔案 判斷該檔案是否存在,並且是否為非空(非空為真)
-S 檔案 判斷該檔案是否存在,並且是否為套接字檔案(是套接字檔案
為真
例如: [[email protected] ~]# test -e /an.txt
4.2按照檔案許可權進行判斷
測試選項 作 用
-r 檔案 判斷該檔案是否存在,並且是否該檔案擁有讀許可權(有讀
許可權為真)
-w檔案 判斷該檔案是否存在,並且是否該檔案擁有寫許可權(有寫
許可權為真)
-x 檔案 判斷該檔案是否存在,並且是否該檔案擁有執行許可權(有
執行許可權為真)
-u 檔案 判斷該檔案是否存在,並且是否該檔案擁有SUID許可權(有
SUID許可權為真)
-g 檔案 判斷該檔案是否存在,並且是否該檔案擁有SGID許可權(有
SGID許可權為真)
-k 檔案 判斷該檔案是否存在,並且是否該檔案擁有SBit許可權(有
SBit許可權為真)

4.3兩個檔案之間的比較
測試選項 作 用
檔案1 -nt 檔案2 判斷檔案1的修改時間是否比檔案2的新(如果新則為真
檔案1 -ot 檔案2 判斷檔案1的修改時間是否比檔案2的舊(如果舊則為真
檔案1 -ef 檔案2 判斷檔案1是否和檔案2Inode號一致,可以理解為兩個
檔案是否為同一個檔案。這個判斷用於判斷硬連結是很
好的方法

4.4兩個整數之間的比較
測試選項 作 用
整數1 -eq 整數
2
判斷整數1是否和整數2相等(相等為真)
整數1 -ne 整數
2
判斷整數1是否和整數2不相等(不相等位置)
整數1 -gt 整數2 判斷整數1是否大於整數2(大於為真)
整數1 -lt 整數2 判斷整數1是否小於整數2(小於位置)
整數1 -ge 整數2 判斷整數1是否大於等於整數2(大於等於為真)
整數1 -le 整數2 判斷整數1是否小於等於整數2(小於等於為真)

4.5字串的判斷
測試選項 作 用
-z 字串 判斷字串是否為空(為空返回真)
-n 字串 判斷字串是否為非空(非空返回真)
字串1 ==字串2 判斷字串1是否和字串2相等(相等返回真)
字串1 != 字串2 判斷字串1是否和字串2不相等(不相等返回真)
4.6多重條件判斷
測試選項 作 用
判斷1 -a 判斷2 邏輯與,判斷1和判斷2都成立,最終的結果才為真
判斷1 -o 判斷2 邏輯或,判斷1和判斷2有一個成立,最終的結果就為
!判斷 邏輯非,使原始的判斷式取反


  • 5、流程控制
5.1 if語句 (1)單分支語句
if [ 條件判斷式 ];then
程式
fi
單分支條件語句需要注意幾個點:
  •  if語句使用fi結尾,和一般語言使用大括號結尾不同
  •  [ 條件判斷式 ]就是使用test命令判斷,所以中括號和條件判斷式之間必須有空格
  •  then後面跟符合條件之後執行的程式,可以放在[]之後,用“;”分割。也可以換行寫入,就不需要“;”了
(2)雙分支語句
if [ 條件判斷式 ]
then
條件成立時,執行的程式
else
條件不成立時,執行的另一個程式
fi

例如:判斷apache是否啟動的指令碼
#!/bin/bash
# Author: abp
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')
#使用nmap命令掃描伺服器,並擷取apache服務的狀態,賦予變數port
if [ "$port" == "open" ]
then
echo “$(date) httpd is ok!” >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &>/dev/null
echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi

5.2case語句 case語句和if…elif…else語句一樣都是多分支條件語句,不過和if多分支條件語句不同的是,case語句只能判斷一種條件關係,而if語句可以判斷多種條件關係。
例如:
case $變數名 in
"值1")
如果變數的值等於值1,則執行程式1
;;
"值2")
如果變數的值等於值2,則執行程式2
;;
.......
*)
如果變數的值都不是以上的值,則執行此程式
;;
esac

5.3 for 語句 格式1:
for 變數 in 值1 值2 值3…
do
程式
done
例如:批量解壓縮指令碼
#!/bin/bash
#批量解壓縮指令碼
# Author: abp
cd /tomcat
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf /lamp/ls.log

格式2:
for (( 初始值;迴圈控制條件;變數變化 ))
do
程式
done
例如:計算1-100的和
#!/bin/bash
#從1加到100
# Author: abp
s=0
for (( i=1;i<=100;i=i+1 ))
do
s=$(( $s+$i ))
done
echo "The sum of 1+2+...+100 is : $s"

5.4while語句 while迴圈是不定迴圈,也稱作條件迴圈。只要條件判斷式成立,迴圈就會一直繼續,直到條件判斷式不成立,迴圈才會停止。這就和for的固定迴圈不太一樣了。
格式如下:
while [ 條件判斷式 ]
do
程式
done
例如:
#!/bin/bash
# Author: abp
i=1
s=0
while [ $i -le 100 ]
#如果變數i的值小於等於100,則執行迴圈
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"