您好,登錄后才能下訂單哦!
一. BASH Shell編程基礎
1. BASH Shell的可執行文件
(1) 內部命令
(2) 外部命令
(3) 腳本文件
?
2. BASH Shell的命令解釋過程
在path指定范圍內查找(外部命令)
......
3. BASH Shell的變量
(1) 變量的分類
-按作用域分
a. 局部變量
b. 全局變量
?
-按用途分
a. 自定義變量
b. 系統環境變量(path)
c. 特殊變量
?
(2) 定義和引用變量
-定義變量: 即用即定義、不用加$
注: 可用export命令將變量輸出為全局變量
-引用變量: $變量名
-取消變量定義: unset變量名
?
(3) 系統環境變量
HISTSIZE?????? 定義歷史記錄的大小
PATH?????????? 定義通用路徑
LANG/LANGUAGE? 定義默認語言
HOSTNAME?????? 定義主機名
SHELL????????? 定義用戶的shell類型
USRENAME?????? 登陸名
HOME?????????? 用戶的家目錄
PWD??????????? 當前工作目錄
注: env命令可以查看當前用戶環境的變量
?
(4) 特殊變量或預定義變量
$1-$9? 代表位置參數
$0???? 代表命令名稱
$$???? 命令進程的PZD
$#???? 命令的位置參數的個數
$*???? 命令的所有位置參數
?
4. BASH SHELL的運算符
(1) 算數運算符
+ -
(2) 比較運算符
-數值比較
-gt 大于
-eq 等于
-lt 小于
-ge 大于等于
-le 小于等于
-ne 不等于
?
-字符串比較
= 等于
!= 不等于
-z 判斷字符串是否為空
?
(3) 邏輯運算符
-a? 與
-o? 或
!?? 非
?
(4) 文件判定運算符
-e? 判斷文件是否存在
-r? 判斷文件是否可讀
-w? 判斷文件是否可寫
-x? 判斷文件是否可執行
-d? 判斷文件是否為目錄文件
-f? 判斷文件是否為普通文件
-c? 判斷文件是否為字符設備文件
-b? 判斷文件是否為塊設備文件
?
5. Bash Shell中的特殊字符
(1) 文件通配符
*????????????? 所有字符
?????????????? 任意單個字符
[..]?????????? 指定范圍內的字符
[^/!..]??????? 指定非范圍內的字符
{字符,...n}??? 指定集合內的字符
?
(2) 替換符
-$????????????????? 引用變量
-${變量名}????????? 引用指定變量的值
-`命令`???????????? 引用指定命令的結果
-$(命令)??????????? 引用指定命令的結果
-$(( 算術表達式 ))? 引用指定表達式的值
?
(3) 其它特殊字符
-'字符'???????????? 表示字符串,關閉所有引用,引用所有被括起來的字符
-"字符"???????????? 表示字符串,引用所有除$和``以外的字符
-\字符????????????? 轉義字符
?
6. BASH Shell提供的內部命令
(1) echo
作用: 顯示指定內容
格式: echo [參數] 字符串/表達式
實例: #echo "linuxsystem"
#echo -n"unix:"
#echo -n"china:"
-n 不換行輸出
?
(2) read
作用: 從鍵盤給指定變量賦值
格式: read 變量名
實例: #read a
?
(3) test
作用: 判斷表達式結果是否為真
格式: test? 表達式
實例: #test$USER="root" && echo "current user isadministrator"
#test -x/usr/sbin/useradd && /usr/sbin/useradd u3
注: 可用[ 表達式 ]來替換test命令
–x???? 文件存在并且可執行
?
(4) if
作用: 實現條件分支
格式: if 表達式/命令;
then
...
命令
...
[else
...
命令
...
]
fi
實例: #if [`id-u`="0"];then echo "current user is root";else echo"current user is not root";fi
?
(5) case
作用: 實現多種條件分支
?
格式: case 變量 in
值1)
...
命令
;;
值2)
...
命令
;;
值3)
...
命令
;;
....
*)
...
;;
esac
?
實例: #vi /script/sh2
#!/bin/bash
echo -n"Input:"
read a
case $ain
off)
poweroff
;;
windows)
init 5
;;
reboot)
reboot
;;
*)
echo"please input off/windows/reboot"
;;
esac
?
(6) for
作用: 實現循環執行命令行
格式: for 變量名 [in 字符串]
do
...
命令行
...
done
實例: #for i in"/etc/*";do echo $i;done//遍歷etc下文件
?
(7) while
作用: 實現循環執行命令行
格式: while 表達式/命令行
do
...
命令
...
done
?
實例: #vi /script/sh4
#!/bin/bash
a=1
s=0
while [$a -le 10 ]
do
s=$(($s+$a ))
a=$(($a+1 ))
done
echo $s
?
(8) exit
作用: 退出程序
格式: exit
?
(9) break/continue
作用: break???? 退出循環
continue? 進入下一次循環
格式: break
continue
?
(10) function
作用: 自定義函數
格式: function 函數名()
{
...
函數體
...
}
?
函數名
?
?
6. 執行Bash腳本
(1) 方法一
設置腳本文件允許用戶具有執行權限,然后用戶可輸入腳本的路徑即可執行
#./5.sh
(2) 方法二
#bash 腳本路徑
?
7. 實例:
請編寫shell腳本,完成以下功能:
(1)shell腳本運行時會在屏幕上顯示以下畫面
*********************************************
*???????????????? Main Menu???????????????? *
*?????????? 1. poweroff???????????????????? *
*?????????? 2. start iptables?????????????? *
*?????????? 3. create user????????????????? *
*?????????? 4. exit???????????????????????? *
*********************************************
(2) 按菜單項前的數字可實現相應的功能
#vi? menu.sh
#functionmu()
#{clear
echo"*********************************************"
echo"*??????????????? Main Menu????????????????? *"
echo"*?????????? 1. poweroff???????????????????? *"
echo"*?????????? 2. start iptables?????????????? *"
echo"*?????????? 3. create user????????????????? *"
echo"*?????????? 4. exit???????????????????????? *"
echo"*********************************************"
#}
#functionft()
echo -n"please input:"
read f
case $fin
1)
poweroff
;;
2)
startiptables
;;
3)
echo -n"useradde"
read u
useradd$u
passwd? $u
;;
4)
exit
;;
*)
echo"please input 1/2/3"
;;
esac
?
mu
ft
?
#chmodu+x menu.sh
?
?
二. 文本過濾命令
1. head
作用: 顯示指定文件的前n行內容
格式: head [-數字] 文本文件
實例: #head -3/etc/passwd
?
2. tail
作用: 顯示指定文件的未尾n行內容
格式: tail -n/+n/-f 文本文件
-f參數,會實時的監視某程序
實例: #tail -3/etc/passwd
#tail +3/etc/passwd
#tail -f/var/log/message
?
3. uniq
作用: 檢查及刪除文本文件中的重復行
格式: uniq [參數] 文本文件
實例: #uniq /abc/f1
#unisq-d /abc/f1
-d:只輸出重復的行
?
4. sort
作用: 對指定文本內容排序顯示
實例: #sort /etc/f1
#sort-t: +2 -3 -n /etc/passwd
#sort -r/abc/f2
-n 數字大小排序
-r 反向排序
-t:+2? 從第二列開始排
?
?
5. grep
作用: 從文本文件中提取符合條件的行
格式: grep [參數] "匹配字符串" 文本文件
實例: #grep"root" /etc/passwd
#grep -c"root" /etc/passwd
#grep -q"root" /etc/passwd
#grep -v"root" /etc/passwd
#grep"^root:" /etc/passwd
-v? 反向匹配
-w? 完整匹配
-i? 忽略大小寫
-c ?只顯示符號要求的幾行
-q? quiet 安靜模式
?
?
6. sed
作用: sed是一種基于命令行的非交互式文本編輯器
格式: sed [參數] 子命令? 文本文件
?
實例: -輸出內容: p子命令
#sed -n'/root/p' /etc/passwd? //顯示有root行的內容
#sed -n'3p' /etc/passwd?? //顯示第三行內容
#sed -n'3,10p' /etc/passwd? //顯示3到10行內容
#sed -n'10,$p' /etc/passwd? //顯示10行到最后一行的內容
?
-刪除內容: d子命令
#sed'/root/d' /etc/passwd //刪除有root的行
#sed'4d' /etc/passwd? //刪除第四行
#sed '4,8d'/etc/passwd? //刪除4到8行的內容
?
-替換內容: s子命令
#sed's/root/admin/g' /etc/passwd? //把root替換成admin
#sed -n's/root/admin/gp' /etc/passwd? //把root替換成admin
?
-讀取指定文件內容: r子命令
#sed '4r/abc/f1' /abc/f2
#sed '$r/etc/shadow' /etc/passwd //passwd要讀取的文件
?
?
-將符合條件的行寫入文件: w子命令
#sed -n'3,10w? /abc/f3' /etc/passwd //讀取/etc/passwd文件第三行到第十行寫入文件/abc/f3
?
-向文件添加內容: a子命令
#sed'3a\linux system' /abc/f1 //第三行后面加上linux system
#sed'/root/a\unix' /abc/f1 //有root的行后面加下unix
?
-向文件插入內容: i子命令
#sed'3i\linux' /abc/f1? //向文件第三行插入linux字符串(新行)
?
-多次編輯: -e 參數
#sed -e'1,10d' -e 's/root/admin/g' /abc/f1
?
-n:使用安靜(silent)模式:匹配到的就顯示出來。反之不顯示
?
三. awk
1. 什么是awk
awk是一種具有編程功能非交互式編輯器,可用于提取、修改文本內容
?
2. awk的使用方法
方法一: #awk [參數] '{awk程序}' 文本文件
方法二: #awk [參數] -f 腳本文件 文本文件
方法三: #awk 腳本文件 文本文件
[-F|-f|-v]?? 大參數,-F指定分隔符,-f調用腳本,-v定義變量var=value
?
3. 認識文本文件的記錄和字段
(1) 以特定記錄分隔符結束的內容稱之為記錄,默認記錄分隔符為換行符,可用$0引用整個記錄
(2) 每個記錄中由特定字符分隔的內容稱之為字段,默認字段分隔符為空格,可用$1-$n引用字段
ipadd? 192.168.16.99?mask 255.255.255.0? //一行為記錄、ipadd為記錄中的字段
?
4. awk提供的運算符、函數和變量
(1) awk的運算符
-算術運算符: + - */ %(取余) ^(乘方)
-關系運算符: <> <= >= == != ~(匹配) !~(不匹配)
-邏輯運算符:&& || !
-賦值運算符: = +=-= *= /= %= ^=
-自增、自減運算符: ++--
-數組引用: in
?
(2) awk的變量
-自定義變量
awk變量分為數值型和字符型,用戶引用變量時即定義了變量,變量類型由變量內容決定,引用變量時不用加$
?
-內置變量
FS?? 字段分隔符(默認是任何空格)
RS?? 記錄分隔符(默認是一個換行符)
NF?? 當前記錄中的字段數
NR?? 當前記錄數
OFS? 輸出字段分隔符(默認值是一個空格)
ORS? 輸出記錄分隔符(默認值是一個換行符)
?
(3) awk的函數
-字符串函數
length(string)?????????????? 求串string中的字符個數
substr(string,position,len)? 返回一個以position開始len個字符的子串
tolower(string)????????????? 轉換為小寫字符
toupper(string)????????????? 轉換為大寫字符
match(string,reg)??????????? 返回正規表達式reg匹配的string中的位置
sub(reg,targetstring)?????? 第一次當正規表達式reg匹配,替換target串中的字符串
index(search,string)???????? 返回string中search串的位置
?
-時間日期函數
systime()??????????????????? 返回當前系統日期和時間
strftime(格式符,日期時間)??? 返回格式化后的日期和時間,strftime常用的格式符
%a? 星期幾的縮寫(Sun)
%A? 星期幾的完整寫法(Sunday)
%b? 月名的縮寫(Oct)
%B? 月名的完整寫法(October)
%c? 本地日期和時間
%d? 十進制日期
%D? 日期 08/20/99
%H? 用十進制表示24小時格式的小時
%I? 用十進制表示12小時格式的小時
%m? 十進制表示的月份
%M? 十進制表示的分鐘
%S? 十進制表示的秒
%y? 兩位數字表示的年(99)
%Y? 四位數字表示的年(9999)
?
-數學函數
int(x)?? 取整
rand()?? 隨機數
sqrt(x)? 平方根
?
5. awk的常用語句
?
(1) print
作用: 輸出指定的字符串或表達式的值
格式: print 字符串/表達式
實例: #awk -F: '{print$1}' /etc/passwd
?
(2) printf
作用: 格式化輸出指定字符串或表達式的值
格式: printf "格式符/字符串",表達式/變量
實例: #awk -F: '{printf"username:%s\n",$1}' /etc/passwd
?
-轉義字符
\t? table制表位
\n? 換行符
\\? 表示“\”
\b? 表示退格
?
-格式符
%c???? 輸出單個字符
%d%i? 輸出整數
%e???? 按科學計數法輸出小數
%f???? 輸出浮點數
%s???? 輸出字符串
%%???? 輸出%
?
(3) if
作用: 實現條件分支
格式: if(條件表達式)
{
...
}
[else
{
...
}]
實例: #awk -F:'{if($3==0) {print $0}}' /etc/passwd
?
(4) for
作用: 實現循環執行
格式:for(init_cntr;test_cntr;incr_cntr)
{
...
}
實例: #awk -F:'{for(i=1;i<5;i++) {printf "%s:",$i} print \n}'/etc/passwd
#awk -F:'{for(i=0;i<6;i++) {printf "%s:\n", $i} }' /etc/passwd
?
(5) while
作用: 實現循環執行
格式: while(條件表達式)
{
...
}
實例: #awk -F:'{i=1;while(i<5) {printf "%s:",$i} print \n}'/etc/passwd
?
(6) BEGIN
作用: 定義awk在打開文件之前所執行的操作
格式: BEGIN{
...
}
?
(7) END
作用: 定義awk在處理文件結束后所執行的操作
格式: END{
...
}
?
(8) exit
作用: 退出awk程序
?
(9) break
作用: 退出循環
?
(10) continue
作用: 繼續下一次循環
?
(11) next
作用: 讀下一條記錄
?
(12) getline
作用: 讀取一行內容
格式: getline [<文件名|變量名]
?
(13) close
作用: 關閉文件
格式: close(變量名/文件名)
?
5. awk的使用實例
?
(1) 編寫shell腳本和awk腳本用于格式化輸出指定網絡接口的MAC地址、IP地址和子網絡掩碼
?
#vi/shell/ak1
#!/bin/awk-f
BEGIN{
print"?????? ?????Mac&IP Address????????????? "
print"----------------------------------------"}
{
if(NR==1){
printf"Mac Address:%s\n",$5}
if(NR==2){
printf"IP Address:%s\n",substr($2,6)
printf"Net Mask:%s\n",substr($4,6)}
}
END{
print"----------------------------------------"}
#chmoda+x /shell/ak1
#vi/shell/sh2
#!/bin/bash
clear
echo -n"input device name:"
read i
?
ififconfig|grep -q "$i"
then
ifconfig$i|/shell/ak1
else
echo"$i is not active"
fi
#chmoda+x /shell/sh2
?
(2) 編寫shell和awk腳本,統計apache指定日期的IP訪問量()
#vi/shell/ak2
#!/bin/awk-f
BEGIN{
printf"date:"
getlined<"-"??? //d為變量}
{
if(substr($4,2,11)=d){
print $1}
}
#vi/shell/sh3
#!/bin/bash
/shell/ak2/var/log/httpd/access_log|sort|uniq|wc -l //取得日志行數
#chmoda+x /shell/ak2
#chmoda+x /shell/sh3
微信掃一掃?、關注公眾號
?? 不定時分享資料視頻
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。