回顾:

1.shell 脚本

1)需求---->命令 (解决 完成目标)

先走通,再变通

 

2)执行过程

3)开始书写脚本

4)测试

 

完成

5.shell编程中,如果要访问变量值,可以在变量前面加一个______符号

6.说出shell的种类,以及常用的shell

7.linuxshell变量$# $@ $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 其中xx0130

3.shell比较运算符中,数值测试“等于则为真”的是

5.把当前目录(包含子目录)下所有后缀为“.sh”的文件后缀改为“.shell

6.Shell 编程,判断一个文件是不是字符设备文件,如果是将其拷贝到/dev目录下面

7.请编写一个脚本,每天凌晨0点将/root/data目录下的所有文件及文件夹备份到/root/data_bak/yyyyMMdd文件夹下,启动yyyyMMdd为以日期命名的文件夹,即每天需要新生成一个文件夹用于备份数据

8.请写出下列shell脚本:使用for循环在/opt目录下通过随机小写10个字母加固定字符串test批量创建10html文件,创建完成后将test全部改为test_done(for循环实现),并html大写

9.写一个脚本实现判断192.168.1.0/24 网络里,当前在线的ip有哪些

 

 

2.三剑客

find

grep

sed  

功能:增删改查

格式:找谁干啥

    

 

查找

'/oldboy/p'

'//,//p'

 

1.        今日内容:

第1章 1.sed

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。

1.1 Sed命令

1.1.1 增加

c  a   i

#c

      replace

替换

c\

#a

      append

(追加)在当前行下面插入文本

a\

#i

      insert

在当前行上面插入文本

i\

举例:

1, 创建环境

day32 sed-awk_day32创建文件,文件内容如下

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

110,lidao,COCO

 

day32 sed-awk_day32_02

 

实例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

 

day32 sed-awk_day32_03

 

实例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

 

day32 sed-awk_day32_04

 

实例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

 

 

day32 sed-awk_day32_05

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

day32 sed-awk_day32_06

 

实例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

 

day32 sed-awk_day32_07

 

 

实例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

 

day32 sed-awk_day32_08

 

实例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

 

day32 sed-awk_day32_09

 

 

 

第2章   awk

1)指哪打哪

2)精确过滤

2.1 awk 内置变量:

day32 sed-awk_day32_10

2.2 awk 运算符

day32 sed-awk_day32_11

第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

day32 sed-awk_day32_12

 

3.1.2 sed     '/^$/d'   lidao.txt

day32 sed-awk_day32_13

 

3.1.3    awk     '!/^$/'   lidao.txt

day32 sed-awk_day32_14

 

3.1.4   sed  -n '/^$/!p'   lidao.txt

day32 sed-awk_day32_15

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

day32 sed-awk_day32_16

 

^ *$

#* ^ *$ 表示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 {命令}

         模式

 

print

调换/etc/passwd1列和最后一列内容

#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