###############################
1.sed
###############################
sed处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾
sed [参数] ‘命令’ file
p ##显示
d ##删除
a ##添加
c ##替换
i ##插入
(1)p:
显示passwd包含:的内容
sed -n '/\:/p' /etc/fstab
显示以root开头的行
sed -n '/^root/p' /etc/fstab
显示不以root开头的行
sed -n '/^root/!p' /etc/fstab
显示2到6行
sed -n '2,6p' /etc/fstab
不显示2到6行
sed -n '2,6!p' /etc/fstab
(2)d:
删除以UUID开头的行(不改变原文件内容)
sed '/^UUID/d' fstab
删除以#开头的行
sed '/^#/d' fstab
删除以$d开头的行
sed '/^$/d' fstab
删除1到4行
sed '1,4d' fstab
(3)a:
在hello下添加world (此操作不改变原内容)
sed '/hello/aworld' westos
把所有hello替换为hello world
sed 's/hello/hello world/g' westos
把所有hello替换为
hello
world
sed 's/hello/hello\nworld/g' westos
(4)-c:精确替换
sed "/hello/chello world" westos
(5)插入
在每一行第一个hello前换行插入
world
westos
sed "/hello/iworld\nwestos" westos
把全部nologin替换为westos
sed "s/nologin/westos/g" passwd
把3到5行的nologin替换为westos
sed "3,5s/nologin/westos/g" passwd
把所有非开头的#替换为/
sed "s/\//#/g" /etc/fstab
(6)改变原文
这样只会显示改变后的效果
sed 's/hello/hello world/g' westos
如果替换原文必须要加-i(插入)
sed 's/hello/chello world/g' -i westos
######################
2.awk
######################
awk会根据模式一次从文件中抽取一行文本,对这行文本进行切片就是把每个单词单独处理,默认空格为分隔符
在命令格式上分别体现如下
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令快
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果
$0表示显示全部
awk "{print $0}" file
$1表示第一个以此类推
awk "{print $1}" file
$1,$2表示显示第1和第2个
awk "{print $1,$2}" file
指定分隔符为.
awf -F ":" '{print $1,$3}' /etc/passwd
输出文件名和当前操作的行号
awk '{print FILENAME,NR}' /etc/passwd
输出每次处理的行号和当前以:为分隔符的字段数,有nr行,nf列
awk - F: '{PRINT NR,NF}' /etc/passwd
读入第一行文本之前执行的语句,一般用来初始化操作
awk 'BEGIN { A=34;print a+10 }' /etc/passwd
{}:逐行处理
END{} 处理完
awk的简单应用有
在开头加REDHAT,末尾加WESTOS,打印括号内容
awk -F: 'BEGIN{print "REDHAT"} {print NR;print } END {print "WESTOS"}' passwd
输出以bash结尾的内容
awk -F: '/bash$/{print}' /etc/passwd
输出第三行
awk -F: 'NR==3 {print}' /etc/passwd
输出偶数行
awk -F: 'NR % 2 == 0{print}' /etc/passwd
输出第三到第五行
awk -F: 'NR>=3 && NR<=5 {print}' /etc/passwd
统计系统能登陆的用户数量
awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' /etc/passwd
查看家目录不是home且能登陆的用户
$6!~表示从第六个字段后不是某某条件
awk -F ":" '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
统计可登录的用户但是家目录不在/home下个数
awk -F ":" 'BEGIN{N=0} $6!~/^\/home/&&/bash$/{N++} END{print N}' /etc/passwd
显示文件行数
awk 'BEGIN{N=0} {N++} END{print N}' /etc/passwd
统计文本总字数
awk 'BEGIN{N=0} {N+=NF} END{print N}' /etc/passwd
抓取主机ip
ifconfig eth0 | grep "inet " | awk '{print $2}'
(1)if单分支
以:为分隔符统计以bash结尾的用户数量
awk -F: 'BEGIN{i=0}{if($7~/bash$/)(i++)}END{print i}' /etc/passwd
以:为分隔符统计uid小于500的用户数量
awk -F: 'BEGIN{i=0}{if($3<=500)(i++)}END{print i}' /etc/passwd
(2)if双分支
打印uid小于500大于0的用户数量
awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd
(3)for循环
打印1到5
awk 'BEGIN{for(i=1;i<=5;i++){print i}}'
#######################
3.循环
#######################
(1)for循环
打印1到5
awk 'BEGIN{for(i=1;i<=5;i++){print i}}'
检测50内网是否通
#!/bin/bash
for((i=0;i<=50;i++))
do
ping -c1 -w1 172.25.254.$i &> /dev/null && echo 172.25.254.$i is up || echo 172.25.254.$i is down
done
覆盖显示时秒倒数
#!/bin/bash
read -p "输入分钟:" a
read -p "输入秒种:" b
let c=a*60+b
for ((c;c>0;c--))
do
let a=c/60
let b=c%60
echo -n " $a:$b "
echo -ne "\r"
sleep 1
done
(2)while循环
正确执行完毕后重新执行
每隔2秒显示一次系统运行时间
while true
do
uptime
sleep 2
done
(3)嵌套循环
打印乘法表
#!/bin/bash
for((i=1;i<=9;i++))
do
for((m=1;m<=i;m++))
do
echo -ne "$i * $m = $(($i*$m))\t"
done
echo -e "\n"
done
#################################################
4.条件语句
##################################################
(1)if条件语句
格式为
if then
else
elif
fi
写一个脚本实现只有root执行才能自动查看home下的文件
运行
写脚本不同输入不同反馈
(2)case语句
格式为
case $1 in
| | | )
echo " "
;;
*)
echo " "
;;
esac
写脚本不同输入不同反馈
写一个脚本看ip,磁盘空间,系统运行时间和退出
#!/bin/bash
while true
do
echo -e "
\033[31m A 看ip \033[0m
\033[32m B 看磁盘剩余空间 \033[0m
\033[34m C 看系统运行时长 \033[0m
\033[34m Q 退出 \033[0m
"
read -p "输入选择:" a
[ -z "$a" ] && {
echo -e "\033[31m 请输入有效内容 \033[0m"
}
case $a in
a|A)
ifconfig br0 | grep "inet " | awk '{print $2}'
;;
b|B)
df -h | awk 'NR==2{print "剩余空间为:" $4}'
;;
c|C)
uptime | awk '{print $3}' | awk -F. '{print $1}' | awk -F: '{print "运行了"$1"小时"$2"分钟"}'
;;
q|Q)
exit 0
;;
esac
done
结果有五种反馈
无输入时按回车
abc
q退出