1、正则表达式
1.1 正则表达式与通配符(通配符有 * ? [])
正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式
通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、fin·
* 前一个字符匹配0次或任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首。例如:^hello会匹配以hello开头的行
$ 匹配行尾。例如:hello$会匹配以hello结尾的行
[] 匹配中括号中指定的任意一个字符。只匹配一个字符。例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一个数字,[a-z][0-9]匹配小写字母和一个数字构成的两位字符。
[^] 匹配除中括号中的字符以外的任意一个字符。例如:[^0-9]匹配任意一位非数字字符。[^a-z]表示任意一位非小写字母。
\ 转义符。用于取消特殊符号的含义
\{n\} 表示其前面的字符恰好出现n次。例如:[0-9]\{4\}匹配4位数字,[1][3-][0-9]\{9\}匹配手机号码。
\{n,\} 表示其前面的字符出现不少于n次。例如:[0-9]\{2,\}表示两位及以上的数字
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8\}匹配6到8位的小写字母。
“*”前一个字符匹配0次,或任意多次
grep “a*” test_rule.txt 匹配所有内容,包括空白行
grep “aa*” test_rule.txt 匹配至少包含有一个a的行
grap “aaa*” test_rule.txt 匹配最少包含两个连续a的字符串
grap “aaaaa*” test_rule.txt 匹配最少包含四个连续a的字符串
“.”匹配除了换行符外的任意一个字符
grep “s..d” test_rule.txt 匹配在s和d字母之间一定有两个字符的单词
grep “s.*d” text_rule.txt 匹配在s和d字母之间有任意字符
grep “.*” text_rule.txt 匹配所有内容
“^”匹配行首,“$”匹配行尾
grep “^M” test_rule.txt 匹配以大写M开头的行
grep “n$” text_rule.txt 匹配以小写n结尾的行
grep -n “^$” test_rule.txt 匹配空白行
“[]”匹配中括号指定的任意一个字符,只匹配一个字符
grep “s[ao]id” test_rule.txt 匹配s和i字符中间,不是a,就是o
grep “[0-9]” test_rule.txt 匹配任意一个数字
grep “^[a-z]” test_rule.txt 匹配用小写字母a开头的行
“[^]”匹配除中括号的字符以外的任意一个字符
grep “^[^a-zA-Z]” test_rule.txt 匹配不用字母开头的行
grep “^[^a-z]” test_rule.txt 匹配不用小写字母开头的行
“\”转义符
grep “\.$” test_rule.txt 匹配使用“.”结尾的行
“\{n\}”表示其前面的字符恰好出现n次
grep “a\{3\}” test_rule.txt 匹配a字母连续出现3次的字符串
gerp “[0-9]\{3\}” test_rule.txt 匹配包括连续的三个数字的字符串
“\{n,m\}”匹配其前面的字符至少出现n次,最多出现m次
grep “sa\{1,3\}i” test_rule.txt
2、字符截取命令
2.1 cut字段提取命令
cut -df 文件名
-d 提取第几列
-f 按照指定分隔符分隔列
2.2 pringf命令
printf ‘输出类型输出格式’ 输出内容
输出类型
%ns 输出字符串。n是数字指代输出几个字符串
%ni 输出整数。n是数字指代输出几个数字
%m.nf 输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%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 小于等于
动作(Action):
格式化输出
流程控制语句
BEGIN
$ awk ‘BEGIN {printf “This is a transcript \n”} {printf $2 “\t” $6 “\n”}’ student.txt
FS内置变量
$ cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN {FS=”:”} {printf $1 “\t” $3 “\n”}’
END
$ awk ‘END {printf “The End \n”}{printf $2 “\t” $6 “\n”}’ student.txt
关系运算符
$ cat student.txt | grep -v Name| awk ‘$6 >=87 {printf $2 “\n”}’
2.4 sed命令
2.4.1 sed命令
sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
$ sed -nei ‘[动作]’ 文件名
-n 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕
-e 允许对输入数据应用多条sed命令编辑
-i 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a \ 追加,在当前行后添加一行或多行。添加多行时,出最后一行外,每行末尾需要用“\”代表数据未完结
c \ 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结
i \ 插入,在当前行前插入一行或多行。插入多行时,出最后一行外,每行末尾需要用“\”代表数据未完结
d 删除,删除指定的行
p 打印,输出指定的行
s 字串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)
2.4.2 行数据操作
$ sed -n ‘2p’ student.txt
$ sed ‘2,4d’ student.txt
$ sed ‘2a hello’ student.txt
$ sed ‘2i hello\
world’ student.txt
$ sed ‘2c No such person’ student.txt
2.4.3 字符串替换
$ sed ‘s/旧字串/新字串/g’ 文件名
$ sed -i ‘3s/74/99/g’ student.txt
$ sed -e ‘s/Liming//g; s/Gao//g’ student.txt
3、字符处理命令
3.1 排序命令sort
$ sort -fnrtk 文件名
-f 忽略大小写
-n 以数值型进行排序,默认使用字符串型排序
-r 反向排序
-t 指定分隔符,默认的分隔符是制表符
-k n[,m] 按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
$ sort /etc/passwd 排序用户信息文件
$ sort -r /etc/passwd 反向排序
$ sort -t “:” -k 3,3 /etc/passwd 指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序
$ sort -n -t “:” -k 3,3 /etc/passwd
3.2 统计命令 wc
$ wc -lwm 文件名
-l 只统计行数
-w 只统计单词数
-m 只统计字符数
4、条件判断
4.1 按照文件类型进行判断
-b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件 判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件 判断该文件是否存在,并且是否为非空(非空为真)
-S 文件 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)
两种判断格式
$ test -e /root/install.log
$ [ -e /root/install.log ]
$ echo $? 查看上一条命令执行情况
[ -d /root ] && echo “yes” || echo “no” 第一个判断命令如果正确执行,则打印“yes”,否则打印“no”
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和文件2的Inode号是否一致,可以理解为两个文件是否为同一个文件。这个判断能用于判断硬链接是很好的方法
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是否和字符串年不相等(不相等返回真)
name=sc 给name变量负责
[ -z “$name” ] && echo ”yes” || echo “no” 判断name变量是否为空,因为不为空,所以返回no
4.6 多重条件判断
判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终结果才成立
判断1 -o 判断2 逻辑或,判断1或判断2有一个成立,最终结果就为真
!判断 逻辑非,使原始的判断式取反
aa=11
[ -n “$aa” -a “$aa” -gt 23 ] && echo “yes” || echo “no” 判断变量aa是否有值,同时判断变量aa的值是否大于23,所以虽然第一个判断值为真,返回的结果也是假
5、流程控制
5.1 if语句
5.1.1 单分支if条件语句
if [ 条件判断式 ] ; then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
单分支条件语句需要注意几个点:
if语句使用fi结尾,和一般语言使用大括号结尾不同
[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
then后面跟符合条件之后执行的程序,可以放在[]中,用“;”分隔。也可以换行写入,就不需要“;”了。
#!/bin/bash
#统计根分区使用率
#Author:shenchao(Email:shenchao@lampbrother.net)
rate=$(df -h | grep “/dev/sda3” | awk ‘{print $5}’ | cut -d “%” -f1) #把根分区使用率作为变量值赋予变量rate
if [ $rate -ge 80 ]
then
echo “Warning! /dev/sda3 is full!!”
fi
5.1.2 双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个成粗
fi
#!/bin/bash
#备份MySQL数据库
#Author: shenchao (Email:shenchao@lampbrother.com)
ntpdate asia.pool.ntp.org &>/dev/null 同步系统时间
date=$(date +%Y%M%d) 把当前系统时间按照“年月日”格式赋予变量date
size=$(du -sh /var/lib/mysql) 统计mysql数据库大小,并把大小赋予size变量
if [ -d /tmp/dbbak ]
then
echo “Date : $date!” > tmp/dabak/dbinfo.txt
echo “Data size : $size” >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &> /dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo “Date: $date!” > /tmp/dbbak/dbinfo.txt
echo “Date size : $size” >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /varlib/mysql dbinfo.txt &> /dev/null
rm -rf /tmp/dbbak/dbinfo.txt
#!/bin/bash
#判断Apache是否启动
#Author:shenchao (Email:shenchao@lampbrother.net)
prot=$(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 http !!” >> /tmp/autostart-err.log
fi
5.1.3 多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
…省略更多条件…
else
当所有条件都不成立时,最后执行此程序
fi
#!/bin/bash
#判断用户输入的是什么文件
# Author: shenchao (Email: shenchao@lampbrother.net)
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”
exit 2
elif [ -f “$file” ] 判断file的值是否为普通文件
then
echo “$file is a regulare file!”
elif[ -d “$file” ] 判断file的值是否为目录文件
then
echo “$file is directory!”
else
echo “$file is an other file!”
fi
5.2 case语句
多分支case条件语句
case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
5.3 for循环
语法一
for 变量 in 值1值2值3
do
程序
done
语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
5.4 while循环和until循环
5.4.1 while循环
while循环是不定循环,也称为条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。
while [ 条件判断式 ]
do
程序
done
5.4.2 until循环
until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。
until [ 条件判断式 ]
do
程序
done