作业
10.1作业:将公钥发送到能和本机通信的pc。不能通信发送失败将信息记录
#!/bin/bash
# 将公钥发送到192.168.1.1~192.168.1.10密码是1
[ ! -f/tmp/ip.txt ] && > /tmp/ip.txt
for((i=1;i<=10;i++));do
if [ $(ping -w 2 192.168.1.$i | grep "loss" | cut -d" "-f6) == "0%" ];then
/usr/bin/expect << ok
spawnssh-copy-id 192.168.1.$i
expect"yes/no"
send"yes\n"
expect"password"
send"1\n"
expect eof
ok
else
echo "192.168.1.$i notalive" >> /tmp/ip.txt
fi
1.写点名脚本
略略略
2.匹配用户名是三个字符的用户
解:
cat/etc/passwd| cut -d: -f1 | grep -v "-" | grep"\<...\>"
订正:
cat/etc/passwd | cut -d: -f1 | grep "^\<...\>"
3.删除每行的倒数第二个字符
解:
:%s#\(.\)\(.$\)#\2#
4.显示/boot/grub2/grub.cfg文件中至少一个空白字符开头的行
解:
cat/boot/grub2/grub.cfg | egrep "^[[:space:]]+"
注意grep -E等同于egrep
5.删除每行的倒数第一个字符
:%s#\(.\)\(.$\)#\1#
6.将square和fair调换位置
square andfair
解:
:%s#squareand fair#fair and square#g
订正:
:%s#(square)(and)(fair)#\3\2\1#
转义后
:%s#\(square\)\(and\)\(fair\)#\3\2\1#
7.删除每行的第一个单词(纯字母)
解:
:%s#^[a-zA-Z]\{1,\}##g
8.删除某文件中以#号开头及后面至少有一个空白字符的行(删除注释(注释后有一个空格))
解:
grep -v"^# " pass.txt
订正:
vim进去
:%s@^#[[:space:]]{1,}@@删不了#
:%s@^#[[:space:]]{1,}\|^#$@@转义之后
9.删除某文件中开头的不是注释行的#号(开启注释的选项)
解:
:%s@\(^.\{1,\}\)\(#\{1,\}\)@\1@
订正:
:%s@^#([^[:space:]])@\1@不是空格的删掉#,成了,转义后
:%s@^#\([^[:space:]]\)@\1@(保留$1呀)
10.显示/etc/vsftpd/vsftpd.conf文件中不是#号开头的行
解:
grep -v"^#" /etc/vsftpd/vsftpd.conf我的终于写对了
grep -v “^[[:space:]]{0,}#”/etc/vsftpd/vsftpd.conf张刚
grep -v “^[[:space:]]{0,}#\|^$”/etc/vsftpd/vsftpd.conf张刚,并删空行
11.将倒数第一个字符和倒数第二个字符交换位置
解:
:%s#\(.\)\(.$\)#\2\1#
12.判断用户输入的内容是大写字母,还是小写字母,还是数字,还是特殊符号,如何是混合的输出你输入了有什么,例:输入A1,你输入了大写字母,数字
解:
read -p"input:" input
if [[ $input=~ .*[0-9]+.* ]];then 表示.*前面任意.*后面任意
echo "你输入了数字"
fi
if [[ $input=~ [A-Z]+ ]];then
echo "你输入了大写字母"
fi
if [[ $input=~ [a-z]+ ]];then
echo "你输入了小写字母"
fi
if [[ $input=~ [[:punct:]]+ ]];then
echo "你输入了特殊符号"
fi
订正:
哈哈,特殊符号是[[:punct:]],技高一筹啊组长
1.使用case实现成绩的优良差的判断
90-100 非常优秀
80-89 优秀
70-79 良好
61-69 还需努力成绩不理想
60 刚刚及格
0-59 差
如果输入的不是数字 提示输入的内容不正确,请重新输入
输入exit退出,其他不退出
解:
vim case.sh
for((;;));do 死循环while do read....;done
read -p "input score:" score
if [[ ! $score =~ ^[0-9]+$ ]];then
echo "输入的内容不正确,请重新输入"
else
break
fi
done
case $scorein
9[0-9]|100)
echo "非常优秀";;
8[0-9])
echo "优秀";;
7[0-9])
echo "良好";;
6[1-9])
echo "还需努力成绩不理想";;
60)
echo "刚刚及格";;
[0-9]|[1-5][0-9]) 注意0~9要单独写,因为是个位数
echo "差";;
exit)
exit;;
*)
echo "输入的范围不正确,请输入0~100"
esac
2.vim删除每行的第一个字符
解:
:%s#^.##g
3.vim在每行行首添加hello字段
解:
:%s#^#hello#g
4.vim将ro或re替换成A
解:
:%s#ro\|re#A#g
5.编写初始化脚本
配置yum源
安装虚拟机软件
安装cherrytree
安装ntfs-3g
安装stardict
按q键退出程序
脚本必须有选择菜单
解:
vim/scripts/yumAuto.sh
echo -e"[localyum]\nname=centos7u3\nbaseurl=file:///mnt/centos7u3\ngpgcheck=0\nenabled=1">> /etc/yum.repos.d/localyum.repo
mkdir/scripts
umount/dev/sr0
mount/dev/sr0 /mnt/centos7u3我忘记挂载在哪儿了啊
yum cleanall
yum repolist
6.vsftpd nfssamba 脚本必须有选择菜单
+:前面的字符出现1次或多次
*:前面的字符出现0次或多次
.:单个任意字符
.*:任意多个字符
?:前面的字符出现0次或1次
\b词首或词尾
|:或,扩展
\|:或,基本
[2346]2 3 46
单个字符出现3次或3次以上a{3,}
cat/etc/passwd | grep -E "s{3,}"扩展匹配不需要转义字符
cat/etc/passwd | grep "s\{3,\}"扩展匹配不需要转义字符
匹配数字及大小写字母[0-9a-zA-Z]或字符集:[[:alnum:]]
POSIX字符类(字符集啊字符集)
表达式 功能 示例
[:alnum:] 字母和数字 [[:alnum:]]匹配所有字母和数字中的任意一个字符 [a-zA-Z0-9]
[:alpha:] 大小写字母 [[:alpha:]]匹配所有字母中的任意一个字符 [a-zA-Z]
[:lower:] 小写字母 [[:lower:]]匹配所有小写字母中的任意一个字符 [a-z]
[:upper:] 大写字母 [[:upper:]]匹配所有大写字母中的任意一个字符 [A-Z]
[:digit:] 数字 [[:digit:]]匹配0-9数字中的任意一个字符 [0-9]
[:blank:] 空格和制表符 [[:blank:]]
[:space:] 包括换行符,回车等所有空白 [[:space:]]
[:punct:] 特殊符号 [[:punct:]]
大写字母:[[:upper:]]
小写字母:[[:lower:]]
分组:\(\) \1
数组:decale -a num注意声明数组是-a
num=({a..z})
查看: declare | grep num
查看数组下标为13:echo ${num[13]}
查看数组里面所有的数值:echo ${num[*]}
14.sed?
sed:
流编辑器
可以流动的过程
vim 和 gedit是交互式的
sed是非交互式的
sed [option]‘地址命令’(单引号) 文件名 使用变量和变量替换用双引号””
地址定位:
地址用于决定对那些行进行编辑。数字、正则表达式、
语法:
head -5/etc/passwd > /tmp/pass.txt
sed ‘4d’(第四行删掉) /tmp/pass.txt(不会对源文件产生影响)
sed ‘2,4d’(第二行到四行删掉) /tmp/pass.txt(不会对源文件产生影响)
sed ‘2,+2d’(第二行到四行删掉) /tmp/pass.txt(不会对源文件产生影响)
sed正则表达式结合
cat/etc/fstab | sed ‘/^#/d’(以#开头的删掉) /tmp/test.txt
这样就不用进入vim里面输入正则操作了
sed ‘/^r/,/^p/p(这个p是打印)’
sed ‘/^root/p’/tmp.pass.txt显示以root开头的那行
但出现了又把全文显示出来了,sed画蛇添足了,怎么办?
关闭模式空间的输出sed -n ‘/^root/p’/tmp.pass.txt就好了
sed a sed i a=o i=O
跳转到第3行的上面并插入hello
sed ‘3i\hello’/etc/passwd相当于vim里的O=i
sed ‘/daemon/i\hello’/etc/passwd
跳转到第3行的下面并插入hello
sed ‘3a\hello’/etc/passwd相当于vim里的o=a
sed ‘/daemon/a\hello’/etc/passwd
支持\n换行
覆盖那个行的内容
sed ‘/^root/c\hello’/etc/passwd
sed ! sed!
删掉除了第一行和第二行其余所有的行
sed ‘1,2!d’/etc/passwd
查找和替换:
vim里面
:s#旧内容#新内容# 这是对光标的那行操作,还可以指定多少行到多少行
:%s#旧内容#新内容#g 这是对全文操作
sed里面
sed ‘s#root#ROOT#’/etc/passwd 没有写小写的g就是对第一个匹配到的换
sed ‘s#root#ROOT#3’/etc/passwd 指定第3次匹配到的换
vim/tmp/test
hello like
my love保存退出
like和love替换为liker和lover:
vim里
:%s#\(l..e\)#\1r# 试试sed里面是不是\1:是的,另外,sed里的$1还能用&表示
sed里
sed ‘s#\(l..e\)#\1r#g’/tmp/test 注意sed里面没有%s了,sed不认识%
&的用法?
sed's#l..e#&r#' pass.txt等同于sed 's#\(l..e\)#\1r#'pass.txt
1.将/etc/passwd中ftp用户的shell换成/bin/bash
指定哪一行:/^ftp/
在那一行做操作:s#/sbin/nologin#/bin/bash#
综合起来就是:sed ‘/^ftp/s#/sbin/nologin#/bin/bash#’
2.修改ip地址,将ip改为192.168.2.30
sed '/^IPADDR=/c\IPADDR=192.168.2.30'/etc/sysconfig/network-scripts/ifcfg-ens33巧妙地用了覆盖c\newtext
sed ‘/IPADDR/s’是什么意思?
指定哪一行:/IPADDR/
在那一行做操作:s#/sbin/nologin#/bin/bash#
综合起来就是:sed ‘/IPADDR/s#/sbin/nologin#/bin/bash#’
指定哪一行:/IPADDR/
在那一行做操作:s#=.*#=192.168.2.30# 老师写的这个还没有我的替换厉害呢
3.将selinux默认的enforcing--->disabled
sed'/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config
或
sed ‘/SELINUX/s#enforcing#disabled#’关键词太简单了
怎么对源文件生效呢?
-i直接修改源文件
做备份
-i.bak或.txt(自己起的后缀名),改动之后的文件后缀名是源文件;备份的没有动
sed ‘5r /etc/issur’ /etc/fstab 将/etc/issur文件中的内容全部添加到/etc/fstab文件的第5行的下面
start:
cat > a.txt << ok
hello
hi
jim
ok
head -5/etc/passwd >> pass.txt
sed ‘加到哪里?1r表示第一行,$r表示最后一行 文件名’ 对谁操作
sed ‘1rpass.txt’ pass.txt
优点:可以加到
若不写哪一行,只写r,会每读一行,添加全部内容
sed ‘/aaa(符合这个模式的行)w(另存为) pass.txt/’ /tmp/t2
start:
sed ‘/^hello/w/tmp/aa.txt’ a.txt不存在会直接将/tmp/aa.txt创建出来,有的话就会覆盖
sed ‘/^hello/w /tmp/aa.txt’ a.txt
做了什么动作 对谁操作
打印第5行(p: print)
sed -n ‘5p’/etc/passwd
打印第5行的下面一行(n:next)
sed -n ‘5{n;p}’/etc/passwd
q:quit
sed ‘5q’/etc/passwd输出前5行就退出
打印第一行和最后一行:
sed -n ‘1p;$p’/etc/passwd
-r允许使用扩展正则表达式
-e允许进行多项编辑,也就是说对同一行做多次处理,也可以做多点编辑-e "动作1" -e "动作2" ==='动作1;动作2'
sed编辑多个还可以不用-e,直接用分号;隔开:
sed'$s#home#class#;$s#/bin#/sbin#' /etc/passwd将最后一行的home改为class,而且将最后一行的/bin改为/sbin
sed -n ‘1p’/etc/passwd
sed -n ‘1p;$p’/etc/passwd
sed -n -r ‘/^\<root\>|^\<user\>/p’/etc/passwd
将/etc/passwd文件中第一行的root替换成@@,bin替换成sbin
sed -e'1s#root#@@#g' -e '1s#/bin#/sbin#' /etc/passwd
标注第几行就不用//去找了
或sed '1s#root#@@#g;1s/bin/sbin/' /etc/passwd
或sed'1{s#root#@@#g;s/bin/sbin/}' /etc/passwd
sed'$s#home#class#' /etc/passwd将最后一行的home改为class
写sed脚本:脚本内容将所有行的root替换成ROOT,将ftp替换成FTP,并在第10行的下面添加一行hello world内容,在第5行的上面添加一行TOM JACK内容
解:
sed's#root#ROOT#g' /etc/passwd
sed's#ftp#FTP#g' /etc/passwd
sed'10a\hello world' /etc/passwd
sed '5i\TOMJACK' /etc/passwd
vim sed.txt
将正则表达式的内容全部写到sed脚本里去:
s#root#ROOT#g
s#ftp#FTP#g
10a\helloworld
5i\TOM JACK
sed -fsed.txt(sed文件脚本名) /etc/passwd(对其操作)
15.awk?
awk是行编辑器,对源文件没有影响
在passwd文件的每一行后面都打印一个空行
awk '{print$0"\n"}' /etc/passwd
-F 指定字段分割符
统计空白行(一语破地):grep -c "^$"/etc/httpd/conf/httpd.conf
清除空行:tr -s "\n"
打印passwd文件的奇数行的行号和内容
awk 'NR%2==1{print NR,$0}' /etc/passwd或cat -n /etc/passwd |awk 'NR%2==1'
注意awk里面最好用单引号,NR代表行号,$0是代表行号后面的内容
将每一行带行号打印10次
awk '{for(i=1;i<=10;i++) {print NR,$0}}'/etc/passwd
start:
考点(必考):文本处理工具有什么?
答:grep文本过滤、sed流编辑、awk报告生成器
awk可以调整格式排版
awk动作用强引号和大括号括起来
awk ‘{print}’pass.txt
$0是整行的内容(默认不写),$0”\n”可以在每行下面增加一行空行
以空格作为分隔符
$1是第一段的内容,$2是第二段的内容
awk ‘{print$1,$2}’ pass.txt 多个参数时两个之间用逗号隔开
上面的情况是只有一行内容,一个文档里面有多行内容怎么办呢?
awk ‘{print$1,$2}’ pass.txt第一行第一段、第二段;第二行第一段、第二段
打印用户名和uid
:分隔的第一部分和第三部分
awk ‘{print$1}’ /etc/passwd打印了全部,因为没有空格作为分隔符,想使分隔符为:怎么办?
awk -F : ‘{$1,$3}’/etc/passwd
输出的时候默认是以空格分隔的,想改变输出的分隔符怎么办?
awk -F : ‘BEGIN{OFS=”$_$”}{print$1,$3}’ /etc/passwd
awk -F":/" '{print $2}' /etc/passwd 指定分隔符,并按分隔符去选取第几段
awk -F":|/" '{print $9}' /etc/passwd一起计算:和/
awk -F"" '{print $1,$2,$3}' /etc/passwd没有分隔符按字符
awk输出
字符串(包括\t)必须用双引号,但是$1,$2等不能用双引号
awk ‘{print “hi”}’b.txt(没有该内容会自动覆盖,和源文件的行一样多)
awk -F: ‘{print$1}’ /etc/passwd
awk -F: ‘{print$1,$7}’ b.txt
awk -F:'{print $1"的shell是"$7}' /etc/passwd
ifconfig 和awk 取出ip地址(注意都是以空格为分隔符的)
ifconfig ens33 | grep "\<inet\>" | awk '{print $2}'
或
ifconfigens33 | awk '{print $2}' | head -2 | tail -1
或
ifconfigens33 | awk '/<inet>/{print $2}'转义后:
ifconfigens33 | awk '/\<inet\>/{print $2}'
ifconfigens33 | awk '{print $0"\n"}'每行下面加入空白行
printf ----可以格式化输出,默认没有换行
使用格式
printf "format" item1,item2,...itemn
format的指示符
format的指示符都是以“%”开头的,后面跟一个字符:如
%s 表示是字符串
%d 表示十进制整数
%f 表示浮点数
%% 表示%本身
%x 表示十六进制数
%o 表示八进制数
%c 表示字符
修饰符:N(数字) 表示显示宽度 %8s 注意:指定字段显示的宽度时>=该字段最长的长度 hello
-:左对齐,默认是右对齐 %8-s(数字后面写-)
没有换行
右对齐
左对齐
可以加字符串@
printf总结:
1.与print不同的是,printf需要指定格式
2.格式是用来指定后面的每个item的输出格式
3.printf不会自动打印换行符,需要时手动添加“\n”
4.printf默认没有输出分隔符
vim gz.txt
调整格式
没对准,用\t
这个8是啥啊?答:就是隔开几个空格
对于浮点数:
%7.2f:其中7表示总的显示宽度(整数位+小数位),2表示小数的位数
%-7.2f:左对齐(数字前面写-)
%.2f:小数位保留两位
凡哥作业4
列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可
who | cut -d' ' -f 1 | sort | uniq
最后登录到当前系统的用户的相关信息
last | head-1
小写转为大写
ls /etc/*.conf | tr -s "a-z""A-Z"
查看密码状态
passwd -Slbx
要求密码的最短使用期限为3天,最长为180天,警告为3天
passwd -n 3-x 180 -w 3 lbx
作业:
交换机和路由器的关系:
静态路由和动态路由:静态路由自己分配ip地址,动态路由DHCP自动分配ip地址
备份:系统备份(操作系统)、用户备份(文件)
每个用户的每个标识是什么?uid
编程语言、上线、领导
系统管理员:资源管理、性能管理、用户管理、进程管理、监控管理、控制管理
linux系统目录的结构:树形结构
/proc:伪文件系统,系统进程相关信息
负载均衡
大后期需要整合出一个万能答案
周四考试
周日就业课
下个月压力面试
项目,自我介绍
写脚本:vsftpd,匿名可以上传,改配置文件/etc/vsftpd/vsftpd.conf用到sed
解:
vim /scripts/vsftpd.sh
sed -i 's@^#\(anon_upload_enable=YES\)@\1@'/etc/vsftpd/vsftpd.conf
chomod o+w/var/ftp/pub
systemctlrestart vsftpd
sed和awk的相同点区别:
sed:对文件内容编辑(可以不写强引号),流编辑,可以用到正则表达式,加-i之后可以直接对源文件进行修改,还能进行原文件备份
awk:动作的部分必须写强引号和大括号,功能大部分是用来输出的,能够以自定的格式来输出,对文本内容进行排版
放在awk上面的sed里面:
1.使用sed删除每行的第一个字符
sed 's#^.##'pass.txt
2.使用sed删除每行的倒数一个字符
sed 's#.$##'pass.txt
3.使用sed删除每行的第二个字符
sed's#\(^.\)\(.\)#\1#' pass.txt
4.使用sed删除每行的倒数第二个字符
sed's#\(.\)\(.$\)#\2#' pass.txt
5.使用sed删除/etc/passwd的第8行和第20行
cat -n/etc/passwd | sed '8d;20d'
6.删除/etc/passwd文件中所有的数字
sed's#[0-9]\{1,\}##g' /etc/passwd
7.取出/etc/sysconfig/network-scripts/ifcfg-enp3s0文件的上级目录名也就是network-scripts 和绝对路径/etc/sysconfig/network-scripts/
解:
ls/etc/sysconfig/network-scripts/ifcfg-ens33 | awk -F/ '{print $4}'
感悟:.*代表任意个字符,用的很多,记住.*
取到文件的路径就是用ls
ls/etc/sysconfig/network-scripts/ifcfg-ens33 | awk -F/ '{print"/"$2"/"$3"/"$4}'
8.在文件/etc/passwd每行的下面添加一行空白行
awk '{print$0"\n"}' /etc/passwd
9.将格式为2017/05/20的日期,替换为2014; 05; 20这样的格式(注意:分号后面有空格)
sed's#/\([0-9]\{2\}\)/#; \1; #' pass.txt
10.将/etc/passwd文件中root用户行打印3行
sed '1!d'/etc/passwd | awk '{print $0"\n"$0"\n"$0}'
加上awk-2里面有作业
1.格式化输出用户名、uid、shell
awk -F:'{printf "%20-s %20-d %20-s\n",$1,$3,$7 }' /etc/passwd
2.将系统所有的组名和组id格式化打印
awk -F:'{printf "%20-s %20-s\n",$1,$3}' /etc/group
3.在2题基础上格式改为 组名 的gid是 gid
awk-F: '{printf "%20-s 的gid是 %20-s\n",$1,$3}' /etc/group