基礎(chǔ)正則表達(dá)式
- 通配符
匹配符合條件的文件名压真,完全匹配娩嚼;ls
、find
、cp
這些命令不支持正則就用通配符匹配 - 正則表達(dá)式
匹配文件中的字符串拓哟,包含匹配往踢;grep
、awk
贵少、sed
這些命令支持正則表達(dá)式
元字符 | 作用 |
---|---|
* | 前一個(gè)字符0次或任意多次 |
. | 匹配除換行符外任意一個(gè)字符 |
^ | 匹配行首 |
$ | 匹配行尾 |
[] | 匹配中括號(hào)中任意一個(gè)字符 |
[^] | 匹配中括號(hào)中字符以外的任意字符 |
\ |
轉(zhuǎn)義符 |
{n} | 表示前面字符恰好出現(xiàn)n次 |
{n,} | 前面字符出現(xiàn)不小于n次 |
{n,m} | 表示前面字符至少出現(xiàn)n次,至多出現(xiàn)m次 |
字符截取命令
cut字段提取命令
grep命令可以提取行堆缘,cut可以提取列滔灶;文件需由制表符組成。cut命令通常和grep命令結(jié)合使用吼肥,通過(guò)管道符录平,依次實(shí)現(xiàn)功能
用法: cut [選項(xiàng)] 文件
選項(xiàng):-f
列號(hào),提取第幾列缀皱;-d
分隔符斗这,提取指定分隔符分割列(默認(rèn)分隔符為制表符)
實(shí)例:提取當(dāng)前系統(tǒng)所有非root用戶
$ cat /etc/passwd|grep /bin/bash|grep -v root|cut -d ":" -f 1
# 查看所有用戶信息,尋找正常用戶信息啤斗,取反剔除root|取得第一列用戶名信息
printf命令格式化打颖砑(awk基礎(chǔ))
$ printf '輸出類型輸出格式' 輸出格式
符號(hào) | 作用 |
---|---|
%ns |
輸出字符串。n是數(shù)字指代輸出幾個(gè)字符 |
%ni |
輸出整數(shù)钮莲。n是數(shù)字指代輸出幾個(gè)數(shù)字 |
%m.nf |
輸出浮點(diǎn)數(shù)免钻。m和n是數(shù)字彼水,指代輸出的整數(shù)位數(shù)和小數(shù)位數(shù) |
輸出類型:
符號(hào) | 作用 |
---|---|
%ns |
輸出字符串。n是數(shù)字指代輸出幾個(gè)字符 |
%ni |
輸出整數(shù)伯襟。n是數(shù)字指代輸出幾個(gè)數(shù)字 |
%m.nf |
輸出浮點(diǎn)數(shù)猿涨。m和n是數(shù)字,指代輸出的整數(shù)位數(shù)和小數(shù)位數(shù) |
符號(hào) | 作用 |
---|---|
\a | 輸出警告音 |
\b | 輸出退格鍵姆怪,也就是Backspace |
\f | 清楚屏幕 |
\n | 換行 |
\r | 回車叛赚,也就是Enter鍵 |
\t | 水平輸出退格鍵,也就是Tab鍵 |
\v | 垂直輸出退格鍵稽揭,也就是Tab鍵 |
輸出格式:
符號(hào) | 作用 |
---|---|
\a | 輸出警告音 |
\b | 輸出退格鍵俺附,也就是Backspace |
\f | 清楚屏幕 |
\n | 換行 |
\r | 回車,也就是Enter鍵 |
\t | 水平輸出退格鍵溪掀,也就是Tab鍵 |
\v | 垂直輸出退格鍵事镣,也就是Tab鍵 |
在awk命令中輸出支持print和printf
- print命令在輸出之后自動(dòng)加一個(gè)換行符
- printf命令是標(biāo)準(zhǔn)輸出,如果需要換行揪胃,就要添加換行符
實(shí)例:
$ vim stu.md
name age scole
john 12 88
alex 13 89
mei 12 90
$ printf '%s\t%s\t%s\t\n' $(cat stu.md)
name age scole
john 12 88
alex 13 89
mei 12 90
awk命令(強(qiáng)化的cut)
cut命令針對(duì)標(biāo)準(zhǔn)的確定的分隔符; awk先讀入第一行璃哟,再使用
$n
截取第n列
命令:$ awk '條件1{動(dòng)作1} 條件2{動(dòng)作2}... 文件名
-
$ awk '$3>=88 {print $1}' stu.md
條件判斷,在第三列大于等于88時(shí)喊递,打印對(duì)應(yīng)第一列的內(nèi)容(但是列表第一行為表頭沒(méi)有數(shù)字) -
cat stu.md|grep -v name|awk '$3>=89 {print $1}'
作用同上随闪,提前反選出表頭行 -
$ df -h|grep sda6|awk '{printf $5}'|cut -d "%" -f 1
截取硬盤使用情況,選取sda6行骚勘,打印出第5列铐伴,截取百分號(hào)前的數(shù)字 -
$ awk 'BEGIN{print "test !!"} END{print "the end !!"} {print $2 "\t" $5}' stu.md
在awk執(zhí)行命令前后添加信息,執(zhí)行一個(gè)額外的命令 - 如果手工定義分隔符俏讹,一定要注意第一行当宴,強(qiáng)制讀入第一行
$ awk '{FS=":"} {print $1} "\t" $3' /etc/passwd
此時(shí)需強(qiáng)制使用“BEGIN”
$ awk 'BEGIN{FS=":"} {print $1} "\t" $3' /etc/passwd
sed命令
sed 是一種幾乎包括在所有 UNIX 平臺(tái)(包括 Linux)的輕量級(jí)流編輯器。sed主要是用來(lái)將數(shù)據(jù)進(jìn)行選取泽疆、替換户矢、刪除、新增的命令殉疼。(可以從管道符收集數(shù)據(jù)修改)
命令:
$ sed [選項(xiàng)] '[動(dòng)作]' 文件名
選項(xiàng) | 作用 |
---|---|
-n | 一般sed命令會(huì)把所有數(shù)據(jù)都輸出到屏幕 ,如果加入此選擇,則只會(huì)把經(jīng)過(guò)sed命令處理的行輸出到屏幕梯浪。 |
-e | 允許對(duì)輸入數(shù)據(jù)應(yīng)用多條sed命令編輯 |
-i | 用sed的修改結(jié)果直接修改讀件,而不是由屏幕輸出 |
選項(xiàng):
選項(xiàng) | 作用 |
---|---|
-n | 一般sed命令會(huì)把所有數(shù)據(jù)都輸出到屏幕 ,如果加入此選擇,則只會(huì)把經(jīng)過(guò)sed命令處理的行輸出到屏幕。 |
-e | 允許對(duì)輸入數(shù)據(jù)應(yīng)用多條sed命令編輯 |
-i | 用sed的修改結(jié)果直接修改讀件,而不是由屏幕輸出 |
動(dòng)作 | 作用 |
---|---|
a\ | 追加,在當(dāng)前行后添加一行或多行株依。添加多行時(shí),除最后 一行外,每行末尾需要用“\”代表數(shù)據(jù)未完結(jié)。 |
c\ | 行替換,用c后面的字符串替換原數(shù)據(jù)行,替換多行時(shí),除最后一行外,每行末尾需用“\”代表數(shù)據(jù)未完結(jié)延窜。 |
i\ | 插入,在當(dāng)期行前插入一行或多行恋腕。插入多行時(shí),除最后 一行外,每行末尾需要用“\”代表數(shù)據(jù)未完結(jié)。 |
d | 刪除,刪除指定的行逆瑞。 |
p | 打印,輸出指定的行荠藤。 |
s | 字串替換,用一個(gè)字符串替換另外一個(gè)字符串伙单。格式為“行范圍s/舊字串/新字串/g”(和vim中的替換格式類似) 。 |
動(dòng)作:
動(dòng)作 | 作用 |
---|---|
a\ | 追加,在當(dāng)前行后添加一行或多行哈肖。添加多行時(shí),除最后 一行外,每行末尾需要用“\”代表數(shù)據(jù)未完結(jié)吻育。 |
c\ | 行替換,用c后面的字符串替換原數(shù)據(jù)行,替換多行時(shí),除最后一行外,每行末尾需用“\”代表數(shù)據(jù)未完結(jié)。 |
i\ | 插入,在當(dāng)期行前插入一行或多行淤井。插入多行時(shí),除最后 一行外,每行末尾需要用“\”代表數(shù)據(jù)未完結(jié)布疼。 |
d | 刪除,刪除指定的行。 |
p | 打印,輸出指定的行币狠。 |
s | 字串替換,用一個(gè)字符串替換另外一個(gè)字符串游两。格式為“行范圍s/舊字串/新字串/g”(和vim中的替換格式類似) 。 |
字符處理命令
排序命令sort:
$ sort [選項(xiàng)] 文件名
選項(xiàng) | 作用 |
---|---|
-f | 忽略大小寫 |
-n | 以數(shù)值型進(jìn)行排序,默認(rèn)使用字符串型排序 |
-r | 反向排序 |
-t | 指定分隔符,默認(rèn)是分隔符是制表符 |
-k n[,m] | 按照指定的字段范圍排序漩绵。從第n字段開始,m字段結(jié)束(默認(rèn)到行尾) |
實(shí)例:
-
$ sort -n -t ":" -k 3,3 /etc/passwd
以“:”為分隔符贱案,按照第三個(gè)字段的數(shù)字順序排序
統(tǒng)計(jì)命令wc:
$ wc [選項(xiàng)] 文件名
選項(xiàng) | 作用 |
---|---|
-l | 只統(tǒng)計(jì)行數(shù) |
-w | 只統(tǒng)計(jì)單詞 |
-m | 只統(tǒng)計(jì)字符 |
條件判斷
按照文件類型進(jìn)行判斷
判斷兩種格式:
- 方法1-命令格式:
$ test -e /root/install.log
- 方法2- 腳本格式:
[$ -e /root/install.log ]
選項(xiàng) | 作用 |
---|---|
-b 文件 | 判斷該文件是否存在,并且是否為塊設(shè)備文件(是塊設(shè)備文件為真) |
-c 文件 | 判斷該文件是否存在,并且是否為字符設(shè)備文件(是字符設(shè)備文件為真) |
-d 文件 | 判斷該文件是否存在,并且是否為目錄文件(是目錄為真) |
-e 文件 | 判斷該文件是否存在(存在為真) |
-f 文件 | 判斷該文件是否存在,并且是否為普通文件(是普通文件為真) |
-L 文件 | 判斷該文件是否存在,并且是否為符號(hào)鏈接文件(是符號(hào)鏈接文件為真) |
-p 文件 | 判斷該文件是否存在,并且是否為管道文件(是管道文件為真) |
-s 文件 | 判斷該文件是否存在,并且是否為非空(非空為真) |
-S 文件 | 判斷該文件是否存在,并且是否為套接字文件(是套接字文件為真) |
加強(qiáng)判斷:
[ -d /root ] && echo "yes" || echo "no"
判斷文件目錄是否存在,如果存在輸出“yes”止吐,如果不存在輸出“no”
判斷文件的讀寫權(quán)限
選項(xiàng) | 作用 |
---|---|
-r 文件 | 判斷該文件是否存在,并且是否該文件擁有讀權(quán)限(有讀權(quán)限為真) |
-w 文件 | 判斷該文件是否存在,并且是否該文件擁有寫權(quán)限(有寫權(quán)限為真) |
-x 文件 | 判斷該文件是否存在,并且是否該文件擁有執(zhí)行權(quán)限(有執(zhí)行權(quán)限為真) |
-u 文件 | 判斷該文件是否存在,并且是否該文件擁有SUID權(quán)限(有SUID權(quán)限為真) |
-g 文件 | 判斷該文件是否存在,并且是否該文件擁有SGID權(quán)限(有SGID權(quán)限為真) |
-k 文件 | 判斷該文件是否存在,并且是否該文件擁有SBit權(quán)限(有SBit權(quán)限為真) |
加強(qiáng)判斷:
[ -w student.txt ] && echo "yes" || echo "no"
判斷文件讀寫權(quán)限宝踪,如果具備寫入權(quán)限,則輸出“yes”碍扔,如果不存在則輸出“no”
兩個(gè)文件之間的判斷
選項(xiàng) | 作用 |
---|---|
文件1 -nt 文件2(newer than) | 判斷文件1的修改時(shí)間是否比文件2的新(如果新則為真) |
文件1 -ot 文件2(older than) | 判斷文件1的修改時(shí)間是否比文件2的舊(如果舊則為真) |
文件1 -ef 文件2 | 判斷文件1是否和文件2的Inode號(hào)一致,可以理解為兩個(gè)文件是否為同一個(gè)文件瘩燥。這個(gè)判斷用于判斷硬鏈接是很好的方法 |
兩個(gè)整數(shù)之間的判斷
選項(xiàng) | 作用 |
---|---|
整數(shù)1 -eq 整數(shù)2(equal than) | 判斷整數(shù)1是否和整數(shù)2相等(相等為真) |
整數(shù)1 -ne 整數(shù)2(no equal) | 判斷整數(shù)1是否和整數(shù)2不相等(不相等位置) |
整數(shù)1 -gt 整數(shù)2(greater than) | 判斷整數(shù)1是否大于整數(shù)2(大于為真) |
整數(shù)1 -lt 整數(shù)2(less than) | 判斷整數(shù)1是否小于整數(shù)2(小于位置) |
整數(shù)1 -ge 整數(shù)2(greater or equal) | 判斷整數(shù)1是否大于等于整數(shù)2(大于等于為真) |
整數(shù)2 -le 整數(shù)2(less or equal) | 判斷整數(shù)1是否小于等于整數(shù)2(小于等于為真) |
實(shí)例:
$ [ 11 -gt 10 ] && echo "yes" || echo "no"
yes
字符串之間的判斷
選項(xiàng) | 作用 |
---|---|
-z 字符串 | 判斷字符串是否為空(為空返回真) |
-n 字符串 | 判斷字符串是否為非空(非空返回真) |
字符串1 == 字符串2 | 判斷字符串1是否和字符串2相等(相等返回真) |
字符串2 !== 字符串2 | 判斷字符串1是否和字符串2不相等(不相等返回真) |
實(shí)例:
$ name=hello
$ [ -z "$name" ] && echo "yes" || echo "no"
no
多重條件判斷
選項(xiàng) | 作用 |
---|---|
判斷1 -a 判斷2(and) | 邏輯與,判斷1和判斷2都成立,最終的結(jié)果才為真 |
判斷1 -o 判斷2(or) | 邏輯或,判斷1和判斷2有一個(gè)成立,最終的結(jié)果就為真 |
! 判斷 | 邏輯非,使原始的判斷式取反 |
實(shí)例:
$ aa=11
$ [ -n "$aa" -a "$aa" -gt 12 ] && echo "yes" || echo "no"
# “-n”判斷變量aa是否存在蕴忆,同時(shí)判斷變量aa是否大于12
流程控制
if語(yǔ)句
if [ 條件判斷式 ]; then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
fi
雙分支if條件句
if [ 條件判斷式 ]
then
條件成立時(shí)颤芬,執(zhí)行的程序
else
條件不成立時(shí),執(zhí)行的程序
fi
實(shí)例1:
#!/bin/bash
#coding:utf-8
#統(tǒng)計(jì)根分區(qū)使用率
#Author: alex
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
# 將根分區(qū)使用率賦值給變量rate
if [ $rate -ge 80 ]
then
echo "Warning! /dev/sda1 is full!!"
else
echo "/dev/sda1 is fine!"
fi
實(shí)例2:
#!/bin/bash
# Author: shenchao (E-mail: shenchao@lampbrother.net)
port=$(nmap -sT 192.168.10.1 | grep tcp | grep http | awk '{print$2}')
#使用nmap命令掃描服務(wù)器,并截取apache服務(wù)的狀態(tài),賦予變量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
nmap命令
$ nmap -sT 192.168.10.1
Starting Nmap 7.01 ( https://nmap.org ) at 2017-08-22 18:15 CST
Nmap scan report for 192.168.10.1
Host is up (0.018s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
80/tcp open http
1900/tcp open upnp
9876/tcp open sd
MAC Address: 30:B4:9E:4C:83:70 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 4.78 seconds
多分支if條件句
if [ 條件判斷式1 ]
then
條件判斷式1為真套鹅,執(zhí)行程序1
elif [ 條件判斷式2 ]
then
條件判斷式2為真站蝠,執(zhí)行程序2
...
else
程序
fi
實(shí)例:
#!/bin/bash
#判斷用戶輸入的是什么條件卓鹿,針對(duì)于當(dāng)前目錄文件和目錄
#Author:alex
read -p "PLease input a filename:" file
#接收鍵盤的輸入菱魔,并賦予變量file
if [ -z "$file" ]
#判斷file是否存在
then
echo "Error, please input a filename!"
exit 1
elif [ ! -e "$file" ]
#判斷file的值是否存在
then
echo "Your input is not a file!"
elif [ -f "$file" ]
#判斷file的值是否為普通文件
then
echo "$file is a regulare file!"
elif [ -d "$file" ]
#判斷file的值是否為目錄文件
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi
case語(yǔ)句
case語(yǔ)句和if...elif...else語(yǔ)句一樣都是多分支條件語(yǔ)句,不過(guò)和if多分支條件語(yǔ)句不同的是,case語(yǔ)句只能判斷一種條件關(guān)系,而if語(yǔ)句可以判斷多種條件關(guān)系。
語(yǔ)法:
case $變量名 in
“值1”)
echo “Your choose is yes!”
;;
"no")
echo "Your choose is no!"
;;
...snip...
*)
如果變量的值都不是以上的值吟孙,則執(zhí)行此程序
澜倦;;
esac
實(shí)例:
#!/bin/bash
# test case
#Author:alex
echo "if you are male, enter M"
echo "if you are female, enter F"
read -t 30 -p "what is your gender: " gender
case $gender in
"M")
echo "Male"
;;
"F")
echo "Female"
;;
*)
echo "error M/F"
;;
esac
for循環(huán)
語(yǔ)法1:
for 變量 in 值1 值2 值3 ...
do
程序
done
- 實(shí)例1:
#!/bin/bash
# test for
#Author:alex
for time in yesterday today tomorrow
do
echo "it is $time!"
done
- 實(shí)例2:
語(yǔ)法2:
for((初始值杰妓;循環(huán)控制條件藻治;變量變化))
do
程序
done
- 實(shí)例1:
#!/bin/bash
# 高斯巷挥,1加到100
#Author:alex
s=0
for ((i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo "the sum of 1+2+...100 is:$s"
- 實(shí)例2:
#!/bin/bash
read -t 30 -p "add user_name: " name
read -t 30 -p "add user_num: " num
read -t 30 -p "add passwd:" pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/^[0-9]*$'//g)
if [ -z "$y" ]
then
for ((i=1;i<=$num;i=i+1))
do
sudo useradd $name$i &>/dev/null
echo $pass | sudo passwd --stdin $name$i &>/dev/null
done
fi
fi
- 實(shí)例3:
#!/bin/bash
# 刪除新添加的用戶
#Author:alex
new_users=$(tail /etc/passwd | grep '/home' | awk 'BEGIN{FS=":"}{print $1}'|grep -v "alex")
for user in $new_users
do
userdel $user &> /dev/null
done
while循環(huán)
while循環(huán)是不定循環(huán),也稱作條件循環(huán)桩卵。只要條件判斷式成立,循環(huán)就會(huì)一直繼續(xù),直到條件判斷式不成立,循環(huán)才會(huì)停止。這和for的固定循環(huán)不一樣。
語(yǔ)法:
while [條件判斷式]
do
程序
done
實(shí)例:
#!/bin/bash
# test while
# Author: alex
i=1
s=0
while [ "$i" -le 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo "the sum is: $s"
until 循環(huán)是一個(gè)終止條件循環(huán)
語(yǔ)法:
while [條件判斷式] # t當(dāng)滿足此條件時(shí)執(zhí)行以下循環(huán)
do
程序
done
實(shí)例:
#!/bin/bash
# test while
# Author: alex
i=1
s=0
until [ "$i" -gt 100 ] #執(zhí)行以下操作雏节,直到不滿足該條件時(shí)停止
do
s=$(($s+$i))
i=$(($i+1))
done
echo "the sum is: $s"