回顾:
1.shell 脚本
1)需求---->命令 (解决 完成目标)
先走通,再变通
2)执行过程
3)开始书写脚本
4)测试
完成
5.在shell编程中,如果要访问变量值,可以在变量前面加一个______符号
6.说出shell的种类,以及常用的shell
7.linux中shell变量$# $@ $0 $1 $2的含义解释?
8.请编写一个脚本,每天凌晨0点将/root/data目录下的所有文件及文件夹备份到/root/data_bak/yyyyMMdd文件夹下,启动yyyyMMdd为以日期命名的文件夹,即每天需要新生成一个文件夹用于备份数据
9.linux从后台启动进程应在最后加一个什么符号
10.在shell中变量的赋值有四种方法,其中。采用name=12 的方法()
A 直接赋值
B 使用read命令
C 使用命令行参数
D 使用命令的输出
11.Linux启动的第一个进程init启动的第一个脚本程序是
12.写出命令,查看所有java进程
2.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx 其中xx从01到30
3.在shell比较运算符中,数值测试“等于则为真”的是
5.把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀改为“.shell”
6.用Shell 编程,判断一个文件是不是字符设备文件,如果是将其拷贝到/dev目录下面
7.请编写一个脚本,每天凌晨0点将/root/data目录下的所有文件及文件夹备份到/root/data_bak/yyyyMMdd文件夹下,启动yyyyMMdd为以日期命名的文件夹,即每天需要新生成一个文件夹用于备份数据
8.请写出下列shell脚本:使用for循环在/opt目录下通过随机小写10个字母加固定字符串test批量创建10个html文件,创建完成后将test全部改为test_done(for循环实现),并html大写
9.写一个脚本实现判断192.168.1.0/24 网络里,当前在线的ip有哪些
2.三剑客
find
grep
sed
功能:增删改查
格式:找谁干啥
查找
'/oldboy/p'
'//,//p'
1. 今日内容:
第1章 1.sedsed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。
1.1 Sed命令
1.1.1 增加
c a i | |||
#c | replace | 替换 | c\ |
#a | append | (追加)在当前行下面插入文本 | a\ |
#i | insert | 在当前行上面插入文本 | i\ |
举例:
1, 创建环境
创建文件,文件内容如下:
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
实例1-1 a\ 在第三行下面插入一行文本,文本内容为 12306,xiao,UFO
[root@zs ~]# sed '3a\12306,xiao,UFO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
12306,xiao,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
实例1-2 c\ 将第三行的内容替换为12306,xiao,UFO
[root@zs ~]# sed '3c\12306,xiao,UFO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
12306,xiao,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
实例1-3 在文件最后一行插入 文本内容如下: a\
12306,xiao,UFO
12580,tao,XO
[root@zs ~]# sed '$a\12306,xiao,UFO\n12580,tao,XO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao,UFO
12580,tao,XO
1.1.2 sed命令删除 delete d
实例1-4 #删除第2行到第5行
[root@zs ~]# cat person.txt 查看文件内容
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@zs ~]# sed '2,5d' person.txt 删除第2行到第5行
101,oldboy,CEO
110,lidao,COCO
实例1-5 #删除从yy开始的行到文件结尾的内容
[root@zs ~]# cat person.txt 查看文件内容
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@zs ~]# sed '/yy/,$d' person.txt 删除从yy开始的行到文件结尾的内容 ( $ )
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
实例1-6 #删除包含lidao的行
[root@zs ~]# cat person.txt 查看文件内容
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@zs ~]# sed '/lidao/d' person.txt 删除包含lidao的行
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
实例1-7 #删除不包含lidao的行
[root@zs ~]# cat person.txt 查看文件内容
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@zs ~]# sed '/lidao/!d' person.txt 删除不包含lidao的行
110,lidao,COCO
第2章 awk
1)指哪打哪
2)精确过滤
2.1 awk 内置变量:
2.2 awk 运算符
第3章 企业案例:不显示文件中的空行
3.1 基础
grep –v '^$' lidao.txt |
sed '/^$/d' lidao.txt |
awk '!/^$/' lidao.txt |
sed -n '/^$/!p' lidao.txt |
3.1.1 grep –v '^$' lidao.txt
3.1.2 sed '/^$/d' lidao.txt
3.1.3 awk '!/^$/' lidao.txt
3.1.4 sed -n '/^$/!p' lidao.txt
3.2 进阶
不显示文件中的空行
文件中可能有空行 只包含空格的行
3.2.1 创建环境:
echo -e 'oldboy\n\n oldboy \n \nlidao \n lidao' >lidao.txt
3.2.2 egrep -v '^$|^ +$' lidao.txt
[root@zs ~]# egrep -v '^$|^ +$' lidao.txt
oldboy
oldboy
lidao
lidao
^ *$
#* ^ *$ 表示0次的时候 ^$
#* ^ *$ 表示0次以上时候 ^ +$
awk '!/[[:space:]]/' person.txt
sed -r '/[[:space:]]/d' person.txt
sed -nr '/[[:space:]]/!p' person.txt
3.2.3 egrep -v "^$|^[ ]+$" lidao.txt
[root@zs ~]# egrep -v "^$|^[ ]+$" lidao.txt
oldboy
oldboy
lidao
lidao
替换 s substitute
's###g'
g === global 全局
[root@zs ~]# sed 's#[0-9]##g' person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO
,lidao,COCO
,xiao.UFO
[root@zs ~]# sed 's#[0-9]##' person.txt
01,oldboy,CEO
02,zhangyao,CTO
03,Alex,COO
04,yy,CFO
05,feixue,CIO
10,lidao,COCO
2306,xiao.UFO
[root@zs ~]# sed 's#[0-9]##g' person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO
,lidao,COCO
,xiao.UFO
后向引用
[root@oldboyedu50-lnb ~]# ifconfig eth0 |sed -rn '2s#^.*r:(.*) Bc.*#\1#gp'
10.0.0.200
^
$
.*
[]
+
()
|
{}
?
[root@zs ~]# ifconfig eth0 |sed -rn '2s#^.*r:(.*) Bc.*#\1#gp'
10.0.0.200
[root@zs ~]# ifconfig eth0 |awk -F'[ :]+' 'NR==2{print $4}'
10.0.0.200
[root@zs ~]# ifconfig eth0 |awk -F'addr:| Bc' 'NR==2{print $2}'
10.0.0.200
[root@zs ~]# ifconfig eth0 |awk -F'[^0-9.]+' 'NR==2{print $2}'
10.0.0.200
第4章 批量添加用户设置随机密码(命令拼接)
4.1 sed命令中使用变量
[root@zs~]# x=oldboy
[root@zs~]# y=oldgirl
[root@zs ~]# sed 's#$x#$y#g' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
[root@zs ~]# sed "s#$x#$y#g" person.txt
101,oldgirl,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
4.2 把文件person.txt文件中的每一行的内容 替换为对应的行号
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
12306,xiao.UFO
1
2
3
4
5
6
7
for n in {1..7}
do
sed -i.bak "${n}s#.*#$n#g" person.txt
done
4.3 重命名:
mv oldboy.txt alex.txt
批量重命名:删除文件名中的html_
touch oldboy_html_{01..10}.jpg
4.3.1 方法1:sed 拼接
mv oldboy_html_01.jpg oldboy_01.jpg
4.3.2 方法2:for循环
4.3.3 方法3:命令 rename
rename oldboy oldgirl *.jpg
找谁 替换为什么 替换哪些文件
4.4 find命令找出包含特殊符号文件名案例
[root@zs /oldboy/name]# find /oldboy -type f -name "*.jpg" -print0 |xargs -0 ls -l
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 01.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 02.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 03.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 04.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 05.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 06.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 07.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 08.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 09.jpg
-rw-r--r-- 1 root root 0 Aug 21 11:03 /oldboy/name/oldgirl_ 10.jpg
#让find命令给每个文件名的结束处 加上一个结束标记
#-print0
#xargs -0 可以识别标记
4.5 sed命令总结:
功能:增删改查
格式:找谁干啥
1.后向引用
2.sed命令中使用变量 for+sed
3.排除空行
4.批量修改文件名
5.批量添加用户
awk 模式匹配与处理语言
gnu awk gawk
-F
-v 定义变量
awk -F: 'NR==1{print $1,$3}' /etc/passwd
'条件 {动作}'
pattern {命令}
模式
调换/etc/passwd第1列和最后一列内容
#awk内置变量(shell 环境变量)
#NR 行号 number of record
#NF 每行有多少列 number of filed
#FS 指定的分隔符 -F: ==== -vFS=:
#$1 $2 第1列 第2列
#$0 一整行的内容
#OFS output 输出分隔符 显示每一列的时候 每一列之间通过什么分开
awk '{print $1,$2}'
[root@zs /oldboy]# awk -F: -vOFS=: '{print $NF,$2,$3,$4,$5,$6,$1}' passwd.txt
/bin/bash:x:0:0:hahaha:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
[root@zs /oldboy]# awk -F: -vOFS=: '{tmp=$1;$1=$NF;$NF=tmp;print}' passwd.txt
/bin/bash:x:0:0:hahaha:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
第5章 总结:
sed命令总结:
功能:增删改查
格式:找谁干啥
1.后向引用
2.sed命令中使用变量 for+sed
3.排除空行
4.批量修改文件名
5.批量添加用户
awk格式
比较表达式
NR>1
$5>500
2.修改配置文件
echo >>
cat >>oldboy.txt<<EOF
EOF
追加文件最后
sudo === /etc/sudoers
cron === /var/spool/cron/
挂载 === /etc/fstab
解析主机名 === /etc/hosts
网卡配置文件 === /etc/sysconfig/network-scripts/ifcfg-eth0