学习记录-第二阶段-sed-awk-shell编程-20181027-晚-1028全天

###Linux三剑客-SED    字符流编辑器 Stream Editor
    sed --version
    查询多行
        sed -n '1p;3p;5p' person.txt
    ##增加
        #加行  sed '3a xxxxx' person.txt
               sed '3i xxxxx' person.txt
            3a在3行的下一行增加3i在3行的前一行增加
    #$  最后一行
    #!p不显示        sed -n '/^$/!p' person.txt 
            sed '$!d' person.txt 不是最后一行的都删除
            awk '!/^$/' person.txt awk的!加前面
    #替换
        s替换这一行中第一个找到的字符串
        g(global)每一行进行全局替换-->s
        i    i.bak/i.ori    表示先备份源文件再修改源文件内容
        #sed中使用变量
            x=oldboy
            y=oldgirl
            sed "s#$x#$y#g" person.txt   一定要注意用"",' '变量不能转化
        单引号:所见即所得    双引号:与单引号类似,特殊符号会被解析 $ $() `` !
    #反向引用    \1第一个小括号中的匹配内容    \2第二个小括号中的匹配内容 sed最多可记9个。
  #ip a s eth0查看eth0网卡信息
#sed 总结 
            sed      找谁                 (!不)干啥

                具体的行号            p--print 显示    与-n一起使用
                正则/oldboy//^101/    增加 a--append 追加/i--insert 插入
                范围1,4                删除d--delete
                范围/101/,/104/        替换s--substitute

###Linux三剑客-awk
取列 取行  #统计   计算
    awk --version
    awk 参数    '条件(找谁){干啥}' 文件
        创建环境
        mkdir -p /server/files/
        cat >>/server/files/reg.txt<<EOF
        Zhang Dandan    41117397   :250:100:175
        Zhang Xiaoyu    390320151  :155:90:201
        Meng  Feixue    80042789   :250:60:50
        Wu    Waiwai    70271111   :250:80:75
        Liu   Bingbing  41117483   :250:100:175
        Wang  Xiaoai    3515064655 :50:95:135
        Zi    Gege      1986787350 :250:168:200
        Li    Youjiu    918391635  :175:75:300
        Lao   Nanhai    918391635  :250:100:175
        EOF
    #正则表达式    awk有两个表示的意思不太一样。
        ^    字符串开头
                例:匹配所有以oldboy开头的字符串  /^oldboy/
                    匹配所有第三列中以oldboy开头  $3~/^oldboy/
        $    字符串结尾
                例: 匹配所有以oldboy结尾的字符串  /oldboy$/
                    匹配第三列中以oldboy结尾的文本(字符串) $3~/oldboy$/
        ##思路,先想条件,通过条件的数据再去操作。
            awk '/Xiaoyu/' reg.txt = awk '$0~/Xiaoyu/' reg.txt
        #显示Xiaoyu的姓氏和ID号码 
            awk '$2~/Xiaoyu/{print $1,$3}' reg.txt 
        #显示所有以41开头的ID号码的人的全名和ID号码
            awk '$3~/^41/{print $1,$2,$3}' reg.txt
        #显示所有ID号码最后一位数字是1或5的人的全名
            awk '$3~/[15]$/{print $1,$2}' reg.txt
            awk '$3~/(1|5)$/{print $1,$2}' reg.txt
        #显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135
            #awk中的替换 gsub(替换substitution  awk gsub;sed sg)
               (gsub中的g和sg中的g一样,都是代表整行,不加为第一个)
                gsub(/目标/,"替换为什么",第几列)
            awk '{gsub(//,"",$4)}' reg.txt
            awk '{gsub(/:/,"$",$4);print}' reg.txt    没有默认输出
            awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' reg.txt
        #gsub为函数,相当于awk中的命令
    #awk进行统计计数公式    #特殊模式BEGIN和END
    BEGIN{} BEGIN里面的内容,会在awk读取文件内容之前运行
        测试、计算(用的少)
    #END{}***  END{}里面的内容,会在awk读取完文件的最后一行之后运行。    
        一般是用来显示最终结果的。(用的多)
        先计算,END显示结果。

        #统计/etc/services文件里面的空行数量
            awk '/^$/{i=i+1}END{print i}' /etc/services
        #公式i=i+1 一般用于统计
            awk '/^$/{i=i+1;print i}' /etc/services
            简化公式:i++

            
            
    #awk数组-统计与计算
        
        处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
        http://www.etiantian.org/index.html
        http://www.etiantian.org/1.html
        http://post.etiantian.org/index.html
        http://mp3.etiantian.org/index.html
        http://www.etiantian.org/3.html
        http://post.etiantian.org/2.html
        

    #secure系统日志分析练习
     谁在破解你的密码(Failed passwdword 每个ip地址出现的次数)
     分析系统的每个用户被破解的次数


    总结:
    1.awk数组进行统计(最核心)
      i=i+1  == i++    统计次数
      i=i+$n == i+=$n 累计相加 累加
    2.awk执行过程
    3.awk通过正则作为模式
    4.BEGIN和END特殊模式


#####linux编程
    cat /etc/shells 可以查看命令解释器种类。
    file命令查看是否是shell脚本。
    脚本第一行 #!/bin/bash #!称为幻数  能被内核识别  也可以#!/bin/sh
    第二行 #desc:  描述
    第三行 #author: 作者
    第四行 #time:    时间
    第五行 #version: 版本
  ###变量        
    #普通变量  字母、数字、下划线组成    必须以字母或下划线开头
           驼峰语法:首个单词字母小写,其余单词首字母大写 oldboyAgeSex=1
        week=10;echo ${week}day
        $week实际上就是${week}。
    #全局变量/环境变量    大写,linux里面哪里都可以用。
                在创建他们的shell及其派生出来的子Shell中使用(如脚本中)
                    另开一个shell和su到别的用户都不行。
        env命令 只显示全局变量
      取消变量:unset OLDBOY (普通全局都可以)
    
        #与用户环境变量有关的文件/目录
            #全局环境变量配置文件
            /etc/profile(基本只要这个)   /etc/bashrc  
            /etc/profile.d(用户登录到系统,会运行这个目录下面的脚本)
                脚本要有执行权限(profile.d里的)
            #用户环境变量配置文件 ~/profile ~/bashrc
    #特殊变量
        #位置变量 
            $0:脚本的名字 
            $n(n代表数字) :第n个参数
                $1:第一个参数
            $#:参数的个数(脚本一共有多少个参数)
                [root@oldboyedu-01 scripts]# sh show-arg.sh  a b c
                $0:show-arg.sh $1$2$3:a b c $#:3

        #进程状态变量
            $?:显示上一个命令的执行结果。
                命令执行正确 结果0
                命令执行错误 结果非0
    #如何向变量中放内容
        #直接给出
            sh show-arg.sh 10 20
        #找别人要-read读入    read -p "input x y:" x,y
            read得到的输入默认存储在变量REPLY
            -p “提示语句”,则屏幕就会输出提示语句
            -t 等待时间
            -s 关闭回显,用于密码输入。
  ###循环
    #条件表达式        明天是否下雨  下雨/不下
        #判断文件    
            好习惯:先敲一对[],然后退格输入2个空格,最后再回退一个空格
                    开始输入[ -f /etc/hosts ]([]两边必须有空格才生效)
            -f    文件是否存在     0存在  1不存在
            -d    目录是否存在    0存在  1不存在

        #判断整数
            等于equal:-eq    [1 -eq 1]
            不等于not equal:-ne [ 1 -ne 10 ]    
            大于greater than:-gt [ 2 -gt 1 ]
            大于等于greater equal:-ge 
            小于less than:-lt
            小于等于less equal:-le
          简单案例:判断命令行参数个数等于2.
    #if条件语句
        #单分支条件语句
            if [ $num1 -gt $num2 ];then
                echo $num1 greater than $num2
            else
                echo $num1 less than $num2
            fi
    
        #语法
            if [ $num1 -gt $num2 ];then
                echo $num1 greater than $num2
            else
                echo $num1 less than $num2
            fi
小结:
1.条件表达式
[ -d /oldboy ]
[ -f /oldboy/oldboy.txt ]
[ 10 -gt 9 ]   great than >
[ 10 -ge 9 ]   great equal >=
[ 10 -eq 10 ]  equal      ==
[ 10 -ne 9 ]   not equal  !=
[ 9 -lt 90 ]   less  than <
[ 9 -le 90 ]   less  equal <=
可以 man test
其实 [ -d /oldboy ] === test -d /oldboy (现在这个用的少了,但是看[]的参数可以man test)
2.判断
单分支判断
判断脚本的参数个数不是2就退出。

双分支判断
if [ $1 -gt $2 ];then
   echo  $1 bigger than $2
else
   echo  $1 not bigger than $2
fi

如果 [ $1 -gt $2 ];然后
   echo  $1 bigger than $2
那么
   echo  $1 not bigger than $2
果如

    #for循环语句
        格式
        for 变量名字 in 列表
        do
            命令
        done

        
        for num in 1 2 3 4 5 6 7
        do
            echo "the $num number is :$num"
        done

        
        
        for num in {1..100}
        do
            echo "the $num number is :$num"
        done
    练习:优化linux的开机启动项目
        只保留crond;sshd;network;rsyslog;sysstat,其他的都关闭。

    for chk in `awk '!/crond|sshd|network|rsyslog|sysstat/{print $1}' chkconfig.txt`
do
#               echo $chk off(第一遍先echo检查)
                chkconfig $chk off
done


#执行脚本调试技巧
-x显示过程
[root@oldboyedu-01 scripts]# sh -x ip.sh 
+ date +%F_%w
2018-10-28_0
+ awk -F '[: ]+' 'NR==2{print $4}'
+ /sbin/ifconfig eth0
10.0.0.200

+:后接命令
没有+:显示在屏幕上。

总结:
1.特殊变量 位置$1 $2 $0 状态$? 其他$#
2.普通变量命名规则
3.普通变量与环境变量区别
4.与用户有关的文件和目录        
5.条件表达式,判断,循环
6.优化系统启动项目
7.批量添加用户并设置随机密码    
        

转载于:https://my.oschina.net/u/4005625/blog/2253664

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值