一. 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/sh1
#!/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/sh3
#!/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/sh1
#!/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/sh1
(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/sh2
#!/bin/bash
/shell/ak2/var/log/httpd/access_log|sort|uniq|wc -l //取得日志行数
#chmoda+x /shell/ak2
#chmoda+x /shell/sh2