一、正则表达式:
例子:
二、字符截取命令
1、cut 选项 文件名 cut进行列提取
-f 提取第几列
-d 按照指定的分隔符分隔列
注意:上面的studebt.txt中的间隔不是“空格”,而是制表符“Tab”。
cut -f 2,4 studebt.txt
cut -d ":" -f 2,3 /etc/passwd
案例:假设我想删除当前Linux系统下的除了root外的所有可以登录的普通用户,(所有可以登录的普通用户/bin/bash):
(1)先提取出来所有普通用户的用户名
cat /etc/passwd | grep "/bin/bash" | grep -v root | cut -d ":" -f 1
(2)再把提取出来的用户的用户名赋值给一个变量,用循环的方式一个一个删除。
注:cut命令只能识别制表符Tab,逗号,冒号等作为间隔符的列,不能识别空格作为间隔符的列,--->因此cut符具有局限性,从而引出awk。
2、printf 格式化输出命令
printf "输出类型输出格式" 输出内容
%ns 字符串
%ni 整数
%m.nf 浮点数
下面介绍几个案例:
3、awk 列截取
可以进行截取字符段、函数、判断、流程控制等强大的功能。
上图,注: $2表示第2列;\r回车 ; \t Tab ; \n换行
介绍awk中的几个常用命令:
(1)BEGIN:主要用于处理FS默认的分隔符
cat /etc/passwd|grep "/bin/bash"|awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
(2)FS内置变量:手工定义分隔符,默认情况下awk的分隔符是Tab、空格。
cat student.txt|grep -v name|awk '$6>80 {printf $2 "\n"}'
(3)END
awk 'END {printf "The End\n"} printf $2 "\t" $6 "\n"' student.txt
4、sed 流编辑器 (以行为单位)
作用:对文件中的数据进行选取、增删改。
sed 选项 '动作'
选项:
-n 只打印查询出的内容
-e 允许多个条件执行,多个条件之间用“分号”或“回车”
-i 修改了文件本身内容,不加-i并没有修改文件的内容
动作:注意,动作必须用单引号括起来!
a 追加
i 行之前插入
p 打印输出
d 删除
c 替换
行号s/旧字符串/新字符串/g 替换字符串
三、字符处理命令
1.排序命令sort
sort 选项 文件名
选项:
-f 忽略大小写
-n 以数值排序,默认以字符串
-r 反向排序
-t 指定分隔符,默认以Tab为分隔符
2.wc 选项 文件名 统计命令
选项:
-l 行数
-w 单词数
-m 字符数
条件判断
两种判断格式:
法1:test -e /root/install.log
法2:[ -e /root/install.log ] 注意:[]与中间的字符串必须有空格
注解:但是每次判断完文件是否存在,我们还需要用echo $?查看文件是否存在,比较麻烦--->因此我们可以用“逻辑运算符”把两句话联系起来,见下:
[ -e /root/install.log ]&&echo "yes" || echo "no"
再例:
[-d /root ]&&echo "yes" || echo "no" 判断/root是否是一个目录;如果是目录,输出yes,否则输出no
四、流程控制语句
(一)控制语句-if语句
1、单分支if条件语句
if [条件判断式] ; then //需要;,和then写在一行
程序
fi
或者
if [条件判断式] //不需要;,不和then写在一行
then
程序
fi
2、双分支if条件语句
if [条件判断式] //不需要;,不和then写在一行
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
3、多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elseif [条件判断式2]
then
当条件判断式2成立时,执行程序2
...省略更多条件...
else
当所有条件都不成立时,执行此程序
fi
注意:
(1)if语句使用fi结尾,和一般语言使用大括号结尾不同
(2)[条件判断式]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
(3)then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了。
例子1:判断分区使用率
#!bin/bash //标注:这个是shell脚本
rate=$(df -h|grep "/dev/sda5"|awk '{printf $5}'|cut -d "%d" -f1) #统计根分区使用率,并把根分区使用率作为变量值赋给rate
if [ $rate -ge 80 ]
then
echo "Warning! /dev/sda3 is full!"
fi
例子2:备份/var/lib/mysql数据库到/tmp/dbbak目录下
#!bin/bash
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 ] 如果/tmp/dbbak目录存在
then
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 /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 /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
例子3:判断apache是否启动 【apache非常常用的脚本】
#!/bin/bash
port=$(nmap -sT 192.168.1.156|grep tcp|grep http|awk '{printf $2}') #使用nmap命令扫描服务器,并截取apache服务的状态,赋值给port
if { "$port" == "open" }
then
echo "$(date) http is ok!">>/tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &>/dev/null
echo "$(date) restart http!">>/tmp/autostart-acc.log
(二)控制语句-case语句
case $变量名 in
"值1")
执行程序1
"值2")
执行程序2
......
*)
如果以上条件不成立,执行此程序
esac
(三)流程控制-for循环
语法一:
for 变量 in 值1 值2 值3
do
程序
done
例1:
#!/bin/bash
for time in morning noon afternoon ecening
do
echo "This is $time"
done
例2:批量解压缩
cd /lamp
ls *.tar.gz>ls.log
for i in $(cat ls.log)
do
tar -zxf$i&>/dec/null
done
语法二:
for ((初始值;循环控制条件;变量变化))
do
程序
done
例:批量添加指定数量的用户
#!/bin/bash
read -p "请输入用户数量:" -t 30 num
read -p "请输入用户名字:" -t 30 name
read -p "请输入用户密码:" -t 30 pass
if[ ! -z "$name" -a ! -z "$name" -a ! -z "$pass"]
then
y=$(echo $num|sed 's/^[0-9]*$//g')
if [ -z "$y" ] 判断输入的num是否为数字
then
for((i=1;i<$num;i=i+1))
do
/usr/sbin/useradd $name$i&>/dev/null
echo $pass|/usr/bin/passwd -- stdin $name$i &>/dev/null
done
fi
fi
(四)while循环和until循环
1、
while [ 条件判断式 ]
do
程序
done
2、
until 只要条件不成立,则一直循环;当条件成立时,循环终止。
until [ 条件判断式 ]
do
程序
done