第1章 sed命令详解

1.1 查找固定的某一行

1.1.1 awk命令方法

  1. [root@znix ~]# awk '!/clsn/' person.txt
  2. 102,znix,CTO
  3. 103,Nmtui,COO
  4. 104,yy,CFO
  5. 105,hehe,CIO

1.1.2 grep方法

  1. [root@znix ~]# grep -v "clsn" person.txt
  2. 102,znix,CTO
  3. 103,Nmtui,COO
  4. 104,yy,CFO
  5. 105,hehe,CIO

1.1.3 sed方法

  1. [root@znix ~]# sed -n '/clsn/!p' person.txt
  2. 102,znix,CTO
  3. 103,Nmtui,COO
  4. 104,yy,CFO
  5. 105,hehe,CIO
  6. [root@znix ~]# sed '/clsn/d' person.txt
  7. 102,znix,CTO
  8. 103,Nmtui,COO
  9. 104,yy,CFO
  10. 105,hehe,CIO

1.2 sed的替换

s:sub(substitute)替换
g:global 表示全局替换

1.2.1 将clsn替换程clsnedu

&表示前面找到的东西。

  1. [root@znix ~]# sed 's#clsn#&666#g' person.txt
  2. 101,clsn666,CEO
  3. 102,znix,CTO
  4. 103,Nmtui,COO
  5. 104,yy,CFO
  6. 105,hehe,CIO

1.2.2 把文件中的数字都替换成样式。

  1. [root@znix ~]# sed 's#[0-9]#<&>#g' person.txt
  2. <1><0><1>,clsn,CEO
  3. <1><0><2>,znix,CTO
  4. <1><0><3>,Nmtui,COO
  5. <1><0><4>,yy,CFO
  6. <1><0><5>,hehe,CIO

g表示把sed命令找到的内容进行替换,不加g 只替换找到的第一个。

  1. [root@znix ~]# sed 's#[0-9]#<&>#' person.txt
  2. <1>01,clsn,CEO
  3. <1>02,znix,CTO
  4. <1>03,Nmtui,COO
  5. <1>04,yy,CFO
  6. <1>05,hehe,CIO

1.2.3 把前面正则表达式找到的第二列内容进行替换

  1. [root@znix ~]# sed 's#[0-9]#<&>#2' person.txt
  2. 1<0>1,clsn,CEO
  3. 1<0>2,znix,CTO
  4. 1<0>3,Nmtui,COO
  5. 1<0>4,yy,CFO
  6. 1<0>5,hehe,CIO

1.2.4 把前面正则表达式找到的第二列以后内容进行替换

  1. [root@znix ~]# sed 's#[0-9]#<&>#2g' person.txt
  2. 1<0><1>,clsn,CEO
  3. 1<0><2>,znix,CTO
  4. 1<0><3>,Nmtui,COO
  5. 1<0><4>,yy,CFO
  6. 1<0><5>,hehe,CIO

1.3 单引号 双引号 不加引号的区别

1.3.1 单引号: 所见即所得

  1. [root@znix ~]# echo '$LANG $(hostname) {1..3}'
  2. $LANG $(hostname) {1..3}

1.3.2 双引号: 对特殊符号进行解析

  1. [root@znix ~]# echo "$LANG $(hostname) {1..3}"
  2. en_US.UTF-8 znix {1..3}

1.3.3 不加引号:支持通配符

  1. [root@znix ~]# echo $LANG $(hostname) {1..3}
  2. en_US.UTF-8 znix 1 2 3

1.4 sed与变量

1.4.1 在变量中放入一行内容

  1. [root@znix ~]# a=hello
  2. [root@znix ~]# a='hello world'
  3. [root@znix ~]# echo $a
  4. hello world

1.4.2 查看下文件的内容

  1. [root@znix ~]# cat person.txt
  2. 101,clsn,CEO
  3. 102,znix,CTO
  4. 103,Nmtui,COO
  5. 104,yy,CFO
  6. 105,hehe,CIO

1.4.3 定义一个变量,对变量进行替换

双引号里面,能够对变量进行解析

  1. [root@znix ~]# sub=clsn
  2. [root@znix ~]# sed "s#$sub#znix#g" person.txt
  3. 101,znix,CEO
  4. 102,znix,CTO
  5. 103,Nmtui,COO
  6. 104,yy,CFO
  7. 105,hehe,CIO

1.4.4 将两个变量分别放置,用变量替换变量。

  1. [root@znix ~]# sub=clsn
  2. [root@znix ~]# aim=znix
  3. [root@znix ~]# sed "s#$sub#$aim#g" person.txt
  4. 101,znix,CEO
  5. 102,znix,CTO
  6. 103,Nmtui,COO
  7. 104,yy,CFO
  8. 105,hehe,CIO

1.5 【企业案例】系统开机启动项优化

将chkconfig中的除 sshd|network|crond|rsyslog|sysstat 之外的全部关闭。

1.5.1 各项服务的含义

  1. crond 定时任务
  2. sshd 远程连接服务
  3. network 网络
  4. sysstat 系统工具
  5. rsyslog 系统日志服务 system log
  6. centos 6.x 7.x 中系统日志服务为rsyslog
  7. centos 5.x 里面系统日志服务为 syslog

1.5.2 第一步把想要保留的排除走

  1. [root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'
  2. abrt-ccpp 0:off 1:off 2:off 3:off 4:off 5:off 6:off
  3. abrtd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
  4. acpid 0:off 1:off 2:off 3:off 4:off 5:off 6:off
  5. atd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
  6. auditd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
  7. blk-availability 0:off 1:on 2:off 3:off 4:off 5:off 6:off
  8. cpuspeed 0:off 1:on 2:off 3:off 4:off 5:off 6:off
  9. ……

1.5.3 第二步取出服务的名字

  1. [root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#\1#g'
  2. abrt-ccpp
  3. abrtd
  4. acpid
  5. atd
  6. auditd
  7. blk-availability
  8. cpuspeed
  9. ……

1.5.4 第三步拼接出想要的形状

  1. [root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#chkconfig \1 off #g'
  2. chkconfig abrt-ccpp off
  3. chkconfig abrtd off
  4. chkconfig acpid off
  5. chkconfig atd off
  6. chkconfig auditd off
  7. chkconfig blk-availability off
  8. ……

1.5.5 第四步交给bash执行

  1. [root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d'|sed -r 's#(^.*)0:.*#\1#g|bash

1.5.6 第五步检查结果

  1. [root@znix ~]# chkconfig |grep "3:on"
  2. crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  3. network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  4. rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  5. sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  6. sysstat 0:off 1:on 2:on 3:on 4:on 5:on 6:off

1.5.7 简化命令

1.5.7.1 示例一:

  1. [root@znix ~]# chkconfig |sed -r '/sshd|network|crond|rsyslog|sysstat/d;s#(^.*)0:.*#chkconfig \1 off#g'|bash

1.5.7.2 示例二

  1. [root@znix ~]# chkconfig |sed -rn '/sshd|network|crond|rsyslog|sysstat/!s#^(.*)0:.*#chkconfig \1 off#gp'|bash

1.6 &符号的使用

&符号找东西会把剩下的显示出来

  1. [root@znix ~]# echo clsn123
  2. clsn123
  3. [root@znix ~]# echo clsn123|sed 's#.*1#&#g'
  4. clsn123
  5. [root@znix ~]# echo clsn123|sed 's#.*1#{&}#g'
  6. {clsn1}23

1.7 【练习题】把person.txt 中包含yy的行 这一行里面的数字替换为空

1.7.1 文件内容

  1. [root@znix ~]# cat person.txt
  2. 101,clsn,CEO
  3. 102,znix,CTO
  4. 103,Nmtui,COO
  5. 104,yy,CFO
  6. 105,hehe,CIO

1.7.2 /yy/查找yy这行,使用s###g对文件内容进行替换

  1. [root@znix ~]# sed -r '/yy/s#[0-9]##g' person.txt
  2. 101,clsn,CEO
  3. 102,znix,CTO
  4. 103,Nmtui,COO
  5. ,yy,CFO
  6. 105,hehe,CIO

1.7.3 将不包含yy的行进行替换

-n 取消默认输出,所以yy那一行不会输出

  1. [root@znix ~]# sed -rn '/yy/!s#[0-9]##gp' person.txt
  2. ,clsn,CEO
  3. ,znix,CTO
  4. ,Nmtui,COO
  5. ,hehe,CIO

1.8 查看sed更多的帮助信息【info】

  1. [root@znix ~]# info sed
  2. faq 经常遇到的问题,经常有人问的问题

第2章 shell 编程

2.1 什么是shell

  1. 命令大礼包<br /> 判断 循环

2.1.1 shell的作用:

  1. 为重复性的工作节约时间,省事

2.2 如何查看当前用户的命令解释器

  1. [root@znix ~]# echo $SHELL
  2. /bin/bash

2.2.1 shell修改为 sh 会有一些问题

  1. [root@znix ~]# sh
  2. sh-4.1# bash
  3. [root@znix ~]#

2.3 书写shell脚本的要求

位置统一存放,便于管理

  1. [root@znix scripts]# pwd
  2. /server/scripts

脚本内容

  1. [root@znix scripts]# vim show.sh
  2. #!/bin/bash ##使用的命令解释器
  3. #filename:show.sh ##文件名
  4. #desc: miaoshu ##描述
  5. /sbin/ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'

脚本中尽量使用命令的绝对路径

  1. [root@znix scripts]# sh show.sh
  2. 10.0.0.201

2.4 shell脚本之变量

2.4.1 什么是变量

举个栗子:

  1. znix 变量的名字
  2. $znix 查看变量里的内容
  3. znix="access" 修改变量的内容
  1. 修改变量的时候最好使用引号将内容引起来。

2.4.2 环境变量(全局变量)

2.4.2.1 特点

1)大写
2)在linux里面都生效

2.4.2.2 查看系统中的环境变量

使用env命令,可以列出系统中,所有的变量

  1. [root@znix scripts]# env
  2. HOSTNAME=znix
  3. TERM=linux
  4. SHELL=/bin/bash
  5. HISTSIZE=1000
  6. SSH_CLIENT=10.0.0.1 3156 22
  7. SSH_TTY=/dev/pts/1
  8. USER=root
  9. ……

2.5 手动创建一个环境变量

2.5.1 创建一个普通变量

  1. [root@znix scripts]# ZNIX=clsn
  2. [root@znix scripts]# echo $ZNIX
  3. clsn

2.5.2 临时创建环境变量

关键:export 是创建环境变量使用的

  1. [root@znix scripts]# export ZNIX=clsn
  2. [root@znix scripts]# env|grep clsn
  3. ZNIX=clsn

2.5.3 让环境变量永久生效

2.5.3.1 将 export ZNIX=clsn 放入 /etc/profile

  1. [root@znix scripts]# echo 'export ZNIX=clsn' >> /etc/profile

2.5.3.2 让写入的内容生效 ,使用source /etc/profile

  1. [root@znix scripts]# source /etc/profile

2.6 shell脚本与变量

2.6.1 脚本的内容:

  1. [root@znix scripts]# cat show2.sh
  2. #!/bin/bash
  3. echo $a

2.6.2 shell与普通变量

只在当前的shell中生效,执行脚本的时候,很产生一个新的shell环境(子shell)。普通变量不能对系统中其他的shell环境产生影响,普通变量没用了。

  1. [root@znix scripts]# a=100
  2. [root@znix scripts]# sh show2.sh

2.6.3 shell与全局变量

全局变量对系统中所有的shell环境都有效,export 在系统任何一个地方都承认他。

  1. [root@znix scripts]# export a=100
  2. [root@znix scripts]# sh show2.sh
  3. 100

2.7 与用户有关的环境变量配置文件/目录

/etc/motd 用户登陆到系统后显示的信息

2.7.1 全局环境变量配置文件

  1. /etc/profile
  2. /etc/bashrc
  3. /etc/profile.d/ (目录)

2.7.2 用户环境变量

  1. ~/.bash_proflie
  2. ~/.bashrc

2.8 变量命名规则

变量名可以是字母、数字或下划线 的组合。
但是不能是以数字开头。
可以以下划线开头。

2.8.1 取变量的时候将变量用{ } 包起来

  1. [root@znix ~]# www=123
  2. [root@znix ~]# echo $www
  3. 123
  4. [root@znix ~]# echo $wwwday
  5. [root@znix ~]# echo ${www}day
  6. 123day

2.9 shell中的特殊变量

2.9.1 $数字 与 $0

  1. [root@znix scripts]# cat para.sh
  2. #!/bin/bash
  3. echo $1 $2 $3 ... $0
  4. [root@znix scripts]# sh para.sh a b c
  5. a b c ... para.sh

$1 添加到Shell的各参数值。$1是第1参数、$2是第2参数
$0 脚本文件的名字

2.9.2 [练习] 使用变量写一个简单的计算器。

2.9.2.1 先写出一个模板。

  1. [root@znix scripts]# cat cal.sh
  2. #!/bin/bash
  3. echo 1+2|bc
  4. [root@znix scripts]# sh cal.sh
  5. 3

2.9.2.2 将期中的内容替换成为变量

  1. [root@znix scripts]# cat cal.sh
  2. #!/bin/bash
  3. echo $1 + $2|bc
  4. [root@znix scripts]# sh cal.sh 100 50
  5. 150

2.9.2.3 将里面的计算方式增加。

  1. [root@znix scripts]# vim cal.sh
  2. #!/bin/bash
  3. echo $1 + $2|bc
  4. echo $1 - $2|bc
  5. echo $1*$2|bc ### *在这里有不能有空格
  6. echo $1 / $2|bc
  7. echo $1 ^ $2|bc

2.9.2.4 执行脚本,进行计算。

  1. [root@znix scripts]# sh cal.sh 4 6
  2. 10
  3. -2
  4. 24
  5. 0
  6. 4096

2.9.3 awk的计算方法

2.9.3.1 awk使用 -v 参数 指定变量。

  1. [root@znix scripts]# awk -va=1 -vb=10 'BEGIN{print a/b }'
  2. 0.1

2.9.3.2 将awk命令放入脚本中

  1. [root@znix scripts]# tail -2 cal.sh
  2. #!/bin/bash
  3. a=$1
  4. b=$2
  5. awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'

2.9.3.3 测试脚本,检查脚本的执行结果。

  1. [root@znix scripts]# sh cal.sh 10 23
  2. 0.434783

第3章 vim 高级使用技巧

3.1 vim中进行查找替换

命令 含义
:4,s#s#1#$a#g 从第4行到最后一行进行替换
:5,s#s#1#$a#g 从第5行到最后一行进行替换
:1,s#s#1#$a#g 从第一行到最后一行进行替换
:%s#1#1#a#g 从第一行到最后一行进行替换
:.s,$s#echo#sed#g 从当前行到最后一行(. 表示当前行)

3.2 vim 快捷键

ctrl + v 按d批量删除 ctrl + v 按x批量删除 dd 删除光标所在行 dG 删除光标所在行到最后一行 D 光标所在位置到行尾的内容 x 删除光标所在位置的一个字符

3.3 vim命令粘贴带#号或注释信息格式会出现混乱情况解决?

问题说明:
  每次复制代码时,如果代码里有 //或# 这样的注释就容易让格式乱掉,显示的内容不整齐,并不是所期望的显示格式。
原因分析:
  是由于vim编辑命令的自动缩进功能所影响,因此粘贴带注释的代码时可以取消自动缩进
问题解决:
  vim在粘贴代码时会自动缩进,把代码搞得一团糟糕,甚至可能因为某行的一个注释造成后面的代码全部被注释掉;最初的解决办法为:用vi去打开文件再粘贴上去,但其实是可以对vim编辑器进行设置修改的。

  1. vim clsn.txt #<--编辑一个文件
  2. :set paste #<--在vim的命令行模式输入,关闭vim缩进功能

  说明:然后再进入插入模式粘贴,代码就不会被自动缩进了,可以敲代码的时候需要自动缩进,所以还需要改回来

  1. :set nopaste #<--开启vim缩进功能

  比较方便的方法就是修改用户家目录下的 .vimrc配置文件:

  1. set pastetoggle=<F9>

  说明:
    以后在插入模式下,只要按F9键就可以快速切换自动缩进模式了

3.4 用sed和awk实现将文本中的上下两行合并为一行

文本内容

  1. [root@MongoDB tmp]# cat -n /tmp/test.txt
  2. 1 bss_data 1
  3. 2 Data 1 2 3 4 5 6 7
  4. 3 bss_data 2
  5. 4 Data 1 2 3 4 5 6 7

使用sed命令实现

  1. [root@MongoDB tmp]# sed -n '{N;s#\n#\t#p}' test.txt|cat -n
  2. 1 bss_data 1 Data 1 2 3 4 5 6 7
  3. 2 bss_data 2 Data 1 2 3 4 5 6 7

N 命令,将下一行读入并附加到当前行后面,以 \n (换行符)分隔,一起存在模式缓冲区内。

awk命令实现

  1. [root@MongoDB tmp]# awk '{tmp=$0;getline;print tmp"\t"$0}' test.txt|cat -n
  2. 1 bss_data 1 Data 1 2 3 4 5 6 7
  3. 2 bss_data 2 Data 1 2 3 4 5 6 7