• sed-awk命令详解


     


    第2章 ***********sed***********. 1目  录

    2.1 -------sed命令小结及小结图---- 1

    2.2 -------第几行---------- 2

    2.3 -------最后一行---------- 2

    2.4 ---------从哪行到哪行-------- 3

    2.5 -------某几行--------- 3

    2.6 ---------上插入行----------- 3

    2.7 -----------不包含oldboy(条件)----- 4

    2.8 -----sed不显示空行----------- 4

    2.9 ------------把所有小写字母()起来----- 4

    2.10 -----变量运用------ 5

    2.11 --------------命令行chkconfig优化开机自启----- 6

    2.12 ----------找特定行替换某一些内容----- 6

    2.13 -----------显示和不显示,要取消默认输出... 7

    2.14 --------------chkconfig 用sed优化----------- 8

    第3章 -------shell基础------- 9

    3.1 --------写脚本---- 9

    3.2 -------------变量-------- 9

    3.3 -----------永久生效有几种-- 10

    3.4 ---------  普通变量,环境变量与脚本---------- 10

    3.5 ------------------vim批量加内容v  Ctrl+v---- 11

    3.6 ----------awk支持小数的计算------------ 11

    3.7 ---------read与计算应用----------- 12

    3.8 --------------test和[  ] 进行条件判断----------------- 14

    3.9 ----&& || 条件判断---------- 14

    3.10 ------------如果---- 15

    3.11 -----------if条件判断------- 15

    3.12 -------------- 参数个数判断------------- 15

    3.13 ------------for循环------- 18

    3.14 ------------chkconfig优化开机自启动服务的脚本----- 19

    3.15 ------------出错暂时无法解决的脚本-------- 19

    3.16 ------------应该再来一个对是否是数字的判断----- 20

    3.17 ------------查看脚本执行的状况- sh -x  --------- 21

    第4章 **************awk*******. 21

    4.1 ------awk执行流程图... 21

    4.2 -----------awk数组结构-------- 22

    4.3 ------awk执行过程表--------- 22

    4.4 ---------awk分隔符哪行哪列-------- 24

    4.5 --------awk题---------- 24

    4.6 -----------awk替换------------ 26

    4.7 ----企业案例3:统计/etc/services文件里面的空行数量--- 27

    4.8 --------awk 数组----------- 28

    4.9 -------企业面试题1:统计域名访问次数---- 处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和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 30

    4.10 ---------awk统计的课后题------- 31

    4.11 ----------awk识别花括号加条件---- 34

    4.12 ----- a[$1]=a[$1]+$2----- 35

    4.13 5. ip出现次数及使用流量... 36

    4.14 ------awk 中的begin---------- 40

    4.15 ------------awk版本4以上有替换功能----- 41

    第5章 ---------总结大集合----- 41

    5.1 -------查看端口总结  踢死了妮妮(tslnn)------- 42

    5.2 ----------- 排查无法上网总结  3p----- 43

    5.3 --------------  vi/vim快捷方式总结---- 44

    5.4 ---sed总结-------- 46

    5.5 ------awk总结--------- 46

    5.6 ------rename----- 47

    第2章 ***********sed***********

    2.1 -------sed命令小结及小结图----

    sed 参数 条件 命令(sed内置命令) 文件

            命令:i,a,d,s,p

    默认输出,取消默认输出;找谁做什么,不做什么,(替换不替换,显示不显示,可以插加不插加吗,可以删不删吗)

    !:放在命令前吗? 

    增:(行号i  行号a 内容)上插下追,insert append ,加多行操作 cat也能多行追加

    删:d    同,命令改d

    改(替换):'Ms###Ng' M查找s 替换, g 全局替换 缺省替换行第一个,加数字几就是找到的第几个进行替换,ng从哪个到最后替换。变化的定义成变量,再替换,双引号解析,双引号变量替换成变量。找到哪行替换,找到不包含谁的行不替换(排除哪行其他行替换)

               四组长吴 2017/9/19 9:02:59

               可以sed '2s#[0-9]#<&>#2p'  精准定位到第二行的第二个匹      配项

    查:p,-n打印经常要取消默认输出, ;单行,多行,第几行到第几行,哪儿到哪儿,逗号隔开,;某几行,分号隔开条件加命令;日志第一个15到第一个08,最后一行$

    p和d显示不显示谁,d相当于排除显示

     

    cat >person.txt <<EOF
    101,oldboy,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    EOF

    2.2 -------第几行----------

    [root@小马过河 old]# sed -n '3p' person.txt

    103,Alex,COO

    [root@小马过河 old]# sed -n '/oldboy/p' person.txt

    101,oldboy,CEO

    2.3 -------最后一行----------

    方法一:

    [root@小马过河 old]# sed -n '$p' person.txt

    105,feixue,CIO

    方法二:

    [root@小马过河 old]# sed -n "$p" person.txt

    105,feixue,CIO

    2.4 ---------从哪行到哪行--------

    [root@小马过河 old]# sed -n '2,4p' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    [root@小马过河 old]# sed -n '/zhangyao/,/yy/p' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    [root@小马过河 old]#

    2.5 -------某几行---------

    [root@小马过河 old]# sed -n '2p;3p;5p' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    105,feixue,CIO

    lrzsz  zip文件两个系统均能用,xshell属性指定下载/加载路径

    离开死s,过来ri

    [root@小马过河 old]# zip -r a.zip /etc/services 
      adding: etc/services (deflated 80%)

    压缩了百分比

    2.6 ---------上插入行-----------

    [root@小马过河 old]# sed '/zhangyao/i wo shi machangwei' person.txt

    101,oldboy,CEO

    wo shi machangwei

    102,zhangyao,CTO

    2.7 -----------不包含oldboy(条件)-----

    方法一:

    [root@小马过河 old]# sed  -n '/oldboy/!p' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    方法二:

    [root@小马过河 old]# sed '/oldboy/d' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    2.8 -----sed不显示空行-----------

    [root@小马过河 ~]# cat 1.txt |sed  '/[a-z0-9:/]/!d'

      root:x:0:0:root:/root:/bin/bash

     bin:x:1:1:bin:/bin:/sbin/nologin

      daemon:x:2:2:daemon:/sbin:/sbin/nologin

    adm:x:3:4:adm:/var/adm:/sbin/nologin

    2.9 ------------把所有小写字母()起来-----

    [root@小马过河 ~]# sed 's#([a-z])#(1)#g' 1.txt -r

      (r)(o)(o)(t):(x):0:0:(r)(o)(o)(t):/(r)(o)(o)(t):/(b)(i)(n)/(b)(a)(s)(h)

     

     (b)(i)(n):(x):1:1:(b)(i)(n):/(b)(i)(n):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)

    [root@小马过河 ~]# sed 's#[0-9]#<&>#3' person.txt

    10<1>,oldboy,CEO

    10<2>,zhangyao,CTO

    10<3>,Alex,COO

    10<4>,yy,CFO

    10<5>,feixue,CIO

    [root@小马过河 ~]# sed 's#,#(,)#' person.txt

    101(,)oldboy,CEO

    102(,)zhangyao,CTO

    103(,)Alex,COO

    104(,)yy,CFO

    105(,)feixue,CIO

    2.10 -----变量运用------

    [root@小马过河 ~]# sed "s#$ma#m#g" person.txt

    101,oldboy,mEO

    102,zhangyao,mTO

    103,Alex,mOO

    104,yy,mFO

    105,feixue,mIO

    [root@小马过河 ~]# sed "s#$ma#m$mam#g" person.txt

    101,oldboy,mEO

    102,zhangyao,mTO

    103,Alex,mOO

    104,yy,mFO

    105,feixue,mIO

    [root@小马过河 ~]# sed "s#$ma#m$ma#g" person.txt

    101,oldboy,mCEO

    102,zhangyao,mCTO

    103,Alex,mCOO

    104,yy,mCFO

    105,feixue,mCIO

    [root@小马过河 ~]# sed "s#$ma#$ma#g" person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@小马过河 ~]# sed "s#$ma#$mam#g" person.txt

    101,oldboy,EO

    102,zhangyao,TO

    103,Alex,OO

    104,yy,FO

    105,feixue,IO

    [root@小马过河 ~]#

    2.11 --------------命令行chkconfig优化开机自启-----

    [root@小马过河 ~]# chkconfig|sed -rn '/sshd|network|rsyslog|crond|systat/!s#^(.*)0:.*$#chkconfig 1 off#gp'|bash

    找到!不替换,取消它的默认输出,

    [root@小马过河 ~]#

    [root@小马过河 ~]# chkconfig|sed -r '/sshd|network|rsyslog|crond|systat/d'|sed -r 's#^(.*)0:.*$#chkconfig 1 off#g'|bash

    [root@小马过河 ~]# chkconfig

    2.12 ----------找特定行替换某一些内容-----

    其他行为默认输出

    [root@小马过河 ~]# sed '/yy/s#[0-9]##g' person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    103,Alex,COO

    ,yy,CFO

    105,feixue,CIO

    不包含yy的行前面的数字替换,默认输出和取消默认输出

    [root@小马过河 ~]# sed -n '/yy/s#[0-9]##gp' person.txt

    ,yy,CFO

     

    [root@小马过河 ~]# sed -n '/yy/!s#[0-9]##gp' person.txt

    ,oldboy,CEO

    ,zhangyao,CTO

    ,Alex,COO

    ,feixue,CIO

    root@小马过河 ~]# sed '/yy/!s#[0-9]##g' person.txt

    ,oldboy,CEO

    ,zhangyao,CTO

    ,Alex,COO

    104,yy,CFO

    ,feixue,CIO

    2.13 -----------显示和不显示,要取消默认输出

    [root@小马过河 ~]# sed -n '/old/!p' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@小马过河 ~]# sed -n '/old/p' person.txt

    101,oldb

    除了要找的显示一次其余的显示两次

    [root@小马过河 ~]# sed '/old/!p' person.txt

    101,oldboy,CEO

    102,zhangyao,CTO

    102,zhangyao,CTO

    103,Alex,COO

    103,Alex,COO

    104,yy,CFO

    104,yy,CFO

    105,feixue,CIO

    105,feixue,CIO

    找到谁不删除和找到谁删除,不需要取消默认输出,可以用来显示哪行不显示哪行(不要空要空呢?)

    [root@小马过河 ~]# sed  '/old/d' person.txt

    102,zhangyao,CTO

    103,Alex,COO

    104,yy,CFO

    105,feixue,CIO

    [root@小马过河 ~]# sed  '/old/!d' person.txt

    101,oldboy,CEO

    2.14 --------------chkconfig 用sed优化-----------

    方法总结:如果想要引用一堆东西中的某一列然后批量生成其它的东西,一个方法是用sed找到找一列,保护起来反向引用替换成想要的批量命令,交给bash执行。即是用sed批量生成含有某一列变量的各种内容

    先批量显示一下做得命令,不要忘了交给bash执行。for循环哪里也有一个方法

    sshd                 0:off      1:off      2:on       3:on       4:on       5:on       6:off

    svnserve       0:off      1:off      2:on       3:on       4:on       5:on       6:off

    sysstat        0:off      1:on       2:off      3:off      4:off      5:off      6:off

    udev-post             0:off      1:on       2:on       3:on       4:on       5:on       6:off

    [root@小马过河 scripts]# chkconfig|sed -nr '/sshd|network|crond|sysstat|rsyslog/!s#(.*)0:.*#chkconfig 1 off#gp'|bash

    [root@小马过河 scripts]# chkconfig

    abrt-ccpp      0:off      1:off      2:off      3:off      4:off      5:off      6:off

    abrtd                 0:off      1:off      2:off      3:off      4:off      5:off      6:off

    acpid                0:off      1:off      2:off      3:off      4:off      5:off      6:off

    atd                  0:off      1:off      2:off      3:off      4:off      5:off      6:off

    auditd                0:off      1:off      2:off      3:off      4:off      5:off      6:off

    blk-availability    0:off      1:on       2:off      3:off      4:off      5:off      6:off

    cpuspeed             0:off      1:on       2:off      3:off      4:off      5:off      6:off

    crond                0:off      1:off      2:on       3:on       4:on       5:on       6:off

    条件,判断,循环,变量

    定义函数,case判断执行

    第3章 -------shell基础-------

    3.1 --------写脚本----

    命令解释器:(几个人,交给bash执行)

    注释:路径,作者

    脚本

    --------- 

    绝对路径,相对路径执行脚本 相对要有执行权限

    3.2 -------------变量--------

    环境变量  普通变量   特殊变量

    sed 外面删除内容

    3.3 -----------永久生效有几种--

    3.4 ---------  普通变量,环境变量与脚本----------

    执行脚本使用变量,普通变量放入脚本或(export)定义成环境变量才可以

                          a=213

    [root@小马过河 scripts]# sh a

     

    [root@小马过河 scripts]# export a=213

    [root@小马过河 scripts]# sh a

    213

    unset 变量 取消变量,环境的也可以

    用户登录显示的东西,运行的脚本/etc/profile.d/

    /etc/profile、/etc/bashrc、
            /etc/profile.d/   
    ~/.bash_profile ~/.bashrc

    [root@小马过河 profile.d]# ma=2

    [root@小马过河 profile.d]# echo $ma

    2

    [root@小马过河 profile.d]# echo $mam

     

    [root@小马过河 profile.d]# echo $ma m

    2 m

    [root@小马过河 profile.d]# echo "$ma"m                     方法一

    2m

    [root@小马过河 profile.d]# echo ${ma}m                     方法二

    2m

    [root@小马过河 profile.d]# echo ·$m·am                      错误一

    ··am

    [root@小马过河 scripts]# echo `$a`a                          错误二

    -bash: 1: command not found

    a

    [root@小马过河 scripts]# echo $($a)a                         错误三

    -bash: 1: command not found

    a

    3.5 ------------------vim批量加内容v  Ctrl+v----

    单用户进入,救援模式进入

    vi从第几行到最后一行,:n,$s###g

    当前行到最后一行:  :.$

    所有航

    批量加内容v  Ctrl+v 上下左右选中输入内容,按Esc退出,不能用Alt选中,因为Alt是xshell功能,不是vim的功能

    3.6 ----------awk支持小数的计算------------

    [root@小马过河 scripts]# awk -va=1 -vb=3 'BEGIN{print a/b}'

    0.333333

    [root@小马过河 scripts]# vim 1.t

    #!/bin/bash

    echo $1 $3 $0 $#                                  怎么使用参数

    [root@小马过河 scripts]# sh 1.t

    1.t 0

    [root@小马过河 scripts]# sh 1.t a b c d e

    a c 1.t 5

    [root@小马过河 scripts]# echo $?             #$?看上一个命令执行的状况

                                   可以看命令行的,可以看脚本执行情况的

    0

    [root@小马过河 scripts]# s 1.t a b c d e

    -bash: s: command not found

    [root@小马过河 scripts]# echo $?                    

    127

    $?有脚本?

    :noh

    3.7 ---------read与计算应用-----------

    [root@小马过河 scripts]# vim cal.sh

    #!/bin/bash

    read  -t40 -p "输入你的游戏帐号:" a

    read  -t40 -p "输入你的游戏帐号:" b

    #a=$1

    #b=$2

    #echo a + b|bc

    #echo a - b|bc

    #echo a * b|bc

    #echo a / b|bc

    #echo a \% b|bc

    #echo a ^ b|bc

    awk -va=$a -vb=$b 'BEGIN{print a+b}'

    awk -va=$a -vb=$b 'BEGIN{print a-b}'

    awk -va=$a -vb=$b 'BEGIN{print a*b}'

    awk -va=$a -vb=$b 'BEGIN{print a/b}'

    awk -va=$a -vb=$b 'BEGIN{print a%b}'

    awk -va=$a -vb=$b 'BEGIN{print a^b}'

    ~                                                  

    ~                                                  

    "cal.sh" 17L, 434C written       

    [root@小马过河 scripts]# sh cal.sh

    输入你的游戏帐号:4  

    输入你的游戏帐号:3

    7

    1

    12

    1.33333

    1

    64

    [root@小马过河 scripts]# vim cal.sh

    #!/bin/bash

    read  -t40 -p "输入你的游戏帐号:" a

    read  -t40 -p "输入你的游戏帐号:" b

    echo $a + $b|bc

    echo $a - $b|bc

    echo $a * $b|bc

    echo $a / $b|bc

    echo $a \% $b|bc

    echo $a ^ $b|bc

    #awk -va=$a -vb=$b 'BEGIN{print a+b}'

    #awk -va=$a -vb=$b 'BEGIN{print a-b}'

    #awk -va=$a -vb=$b 'BEGIN{print a*b}'

    #awk -va=$a -vb=$b 'BEGIN{print a/b}'

    #awk -va=$a -vb=$b 'BEGIN{print a%b}'

    #awk -va=$a -vb=$b 'BEGIN{print a^b}'

    ~                                                  

    ~                                                  

    ~                                                  

    ~                                                  

    "cal.sh" 15L, 434C written       

    [root@小马过河 scripts]# sh cal.sh

    输入你的游戏帐号:4

    输入你的游戏帐号:3

    7

    1

    12

    1

    1

    64

    [root@小马过河 scripts]#

    [root@小马过河 scripts]# find . -name "machangwei"

    [root@小马过河 scripts]# echo $?

    0

    [root@小马过河 scripts]# cat machangwei

    cat: machangwei: No such file or directory

    [root@小马过河 scripts]# echo $?

    1

    3.8 --------------test和[  ] 进行条件判断-----------------

    [root@小马过河 scripts]# test -f changwei            

    [root@小马过河 scripts]# echo $?

    1

    [root@小马过河 scripts]# test -f a

    [root@小马过河 scripts]# echo $?

    0

    [root@小马过河 scripts]# [ -d ma ]

    [root@小马过河 scripts]# echo $?

    1

    [root@小马过河 scripts]# mkdir changwei

    [root@小马过河 scripts]# [ -d changwei ]

    [root@小马过河 scripts]# echo $?

    0

    3.9 ----&& || 条件判断----------

     [root@小马过河 scripts]# [ -d changwei ]&&echo dir exit

    dir exit

                我感觉机子在前一个命令结束之后有一个对返回值的判断

    [root@小马过河 scripts]# [ -f sss ]||touch sss

    [root@小马过河 scripts]# ls

    1.t  a  cal.sh  cal.sh.bak  changwei  date.sh  html.sh  ip.sh  sss  tar.sh

    [root@小马过河 scripts]# [ -d xiaoma ]&&echo dir exit

    [root@小马过河 scripts]#

    3.10 ------------如果----

    如果文件不存在就干啥,如果文件存在就不干啥了

    3.11 -----------if条件判断-------

    [root@小马过河 scripts]# sh if.sh

    [root@小马过河 scripts]# ll maxiaowei

    total 0

    [root@小马过河 scripts]# cat if.sh

    #!/bin/bash

    if [ -d maxiaowei ];

       then

            echo maxiaowei exit

       else

           mkdir maxiaowei

    fi

    [root@小马过河 scripts]#

    3.12 -------------- 参数个数判断-------------

    "canshu.sh" 10L, 135C written    

    [root@小马过河 scripts]# sh canshu.sh 2 3

    5

    [root@小马过河 scripts]# sh canshu 2

    sh: canshu: No such file or directory

    [root@小马过河 scripts]# sh canshu.sh 2 3

    5

    [root@小马过河 scripts]# sh canshu.sh  2

    canshu wei 2

    [root@小马过河 scripts]# cat canshu.sh

    #!/bin/bash

    a=$1

    b=$2

    if [  $# -ne 2 ];

       then

         echo  canshu wei 2

         exit

       else

        awk -va=$a -vb=$b 'BEGIN{print a+b}'

    fi

    [root@小马过河 scripts]#

    [root@小马过河 scripts]# sh canshu.yuan 4 3

    7

    1

    12

    1.33333

    1

    [root@小马过河 scripts]# sh canshu.yuan 4

    canshu wei 2

    [root@小马过河 scripts]# cat anshu.yuan

    cat: anshu.yuan: No such file or directory

    [root@小马过河 scripts]# cat canshu.yuan

    #!/bin/bash

    a=$1

    b=$2

    if [  $# -ne 2 ];

       then

         echo  canshu wei 2

         exit

       else

        awk -va=$a -vb=$b 'BEGIN{print a+b}'

        awk -va=$a -vb=$b 'BEGIN{print a-b}'

        awk -va=$a -vb=$b 'BEGIN{print a*b}'

        awk -va=$a -vb=$b 'BEGIN{print a/b}'

        awk -va=$a -vb=$b 'BEGIN{print a%b}'

    fi

    [root@小马过河 scripts]#

    高超的脚本:

    [root@小马过河 scripts]# sh gaochao.sh

    命令错误 请输入两个数字

    [root@小马过河 scripts]# sh gaochao.sh 4 5

    I love you 开始输出结果

     

    相加结果

    9

    相减结果

    -1

    相乘结果

    20

    相除结果

    0.8

    [root@小马过河 scripts]# cat gaochao.sh

    #!/bin/bash

    num=$#

    if [ "$num" -ne "2" ] ; then

           echo "命令错误 请输入两个数字"

           exit 1

    else

           echo -e "I love you 开始输出结果 "

    fi

     

    a=$1

    b=$2

           echo "相加结果"

    awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1+num2}'

           echo "相减结果"

    awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1-num2}'

           echo "相乘结果"

    awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1*num2}'

           echo "相除结果"

    awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1/num2}'

     

    [root@小马过河 scripts]#

    结合一下 read

    结合函数

    3.13 ------------for循环-------

    多个变量就循环

    for n in xx

    do

    done

    定义变量在哪,

    对每一个变量值循环操作

    [root@小马过河 scripts]# vim wenjian.sh

    #!/bin/bash

    for hd in {01..20}

    do

      date -s "201705$hd"

      touch /tmp/taojin-$(date +%F).txt

    done

    for hd in 2017-05-{01..20}
    do
    date -s $hd
    filename=$(date +%F)
    touch $filename".txt"
    done

    3.14 ------------chkconfig优化开机自启动服务的脚本-----

    a=里面的命令放在命令行执行要|bash,在这里不需要应该是因为它在脚本里,执行脚本时就已经使用执行命令了

    [root@小马过河 scripts]# cat youhuakaiji.sh

    #!/bin/bash

    a=`chkconfig|sed -nr '/sshd|network|cron|sysstat|rsyslog/!s#(.*)0:.*#1#gp'`

    for machangwei in $a

    do

      chkconfig $machangwei off

    done

    [root@小马过河 scripts]#

    同学的脚本

    #!/bin/bash
    for n in $(chkconfig|sed -r '/sshd|network|crond|sysstat|rsyslog/d'|sed -r 's#^(.*)0:.*$#1#g')
    do
       chkconfig  $n off
    done 

    3.15 ------------出错暂时无法解决的脚本--------

    问题:有read命令,但是无法使后面的计算得到执行

    思路拓展:是否需要有个对输入是数字的判断呢

    [root@小马过河 scripts]# vim canshu.sh

    #!/bin/bash

    read -p "请输入两个数字:" a

    read -p "请输入两个数字:" b

    a=$1

    b=$2

    if [  $# -ne 1 ];

       then

         echo 警告:应输入两个数字!!

         exit

       else

        awk -va=$a -vb=$b 'BEGIN{print a+b}'

        awk -va=$a -vb=$b 'BEGIN{print a-b}'

        awk -va=$a -vb=$b 'BEGIN{print a*b}'

        awk -va=$a -vb=$b 'BEGIN{print a/b}'

        awk -va=$a -vb=$b 'BEGIN{print a%b}'

    fi                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

    [root@小马过河 scripts]# sh canshu.sh

    请输入两个数字:1 3

    请输入两个数字:3

    警告:应输入两个数字!!

    [root@小马过河 scripts]# sh canshu.sh

    请输入两个数字:1

    请输入两个数字:3

    警告:应输入两个数字!

    3.16 ------------应该再来一个对是否是数字的判断-----

    [root@小马过河 scripts]# sh canshu.sh # # # # # # # #

    警告:应输入两个数字!!

    [root@小马过河 scripts]# sh canshu.sh nishi shui?

    0

    0

    0

    awk: fatal: division by zero attempted

    awk: fatal: division by zero attempted in `%'

    3.17 ------------查看脚本执行的状况- sh -x  ---------

    计算器加上判断参数个数,扩展判断这两个参数是否为数字。

    课后练习题:批量创建用户并设置随机密码

    第4章 **************awk*******

    ------------awk--------

    4.1 ------awk执行流程图

    4.2 -----------awk数组结构--------

    4.3 ------awk执行过程表---------

    取列计算(统计)

    条件行(可用行列),哪列,

    awk 内置变量  指定分隔符FS,指定输出分隔符OFS,最后一列NF,倒数第几列$(NF-n),只要哪列可以最好以这列前后作为分隔符 多个相同字符加+(+正则表达),指定行分隔符RS,支持正则表达式,

    可加字符""

    算多少行,'{i++}END print i'

    算每行数量相加 '{i=i+$0($1)}END print i'

       取哪列 $数字,$0所有列就是全行内容

       像平面直角坐标系,找列^$

    替换sed好

    计算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

    m 第一列是姓氏
    m 第二列是名字
    m 第一第二列合起来就是姓名
    m 第三列是对应的ID号码
    m 最后三列是三次捐款数量

    4.4 ---------awk分隔符哪行哪列--------

    条件:

    模糊找行

    找列有模糊条件的行

    [root@小马过河 ~]# awk '$2~/waiwai/' /server/files/reg.txt

    [root@小马过河 ~]# awk '$2~/X/' /server/files/reg.txt

    Zhang Xiaoyu    390320151  :155:90:201

    Wang  Xiaoai    3515064655 :50:95:135

    Zhang Xiaoyu    390320151  :155:90:201

    Wang  Xiaoai    3515064655 :50:95:135

    4.5 --------awk题----------

    1显示Xiaoyu的姓氏和ID号码
    2显示所有ID号码最后一位数字是1或5的人的全名
    3姓氏是Zhang的人,显示他的第二次捐款金额及她的名字
    4显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135 

    1

    [root@小马过河 files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt

    Zhang 390320151

    Zhang 390320151

    2.

    方法一:

    [root@小马过河 files]# awk '$3~/(1|5)$/{print $1$2,$3}' reg.txt

    ZhangXiaoyu 390320151

    WuWaiwai 70271111

    WangXiaoai 3515064655

    方法二:

    [root@小马过河 files]# awk '$3~/[15]$/{print $1$2,$3}' reg.txt

    ZhangXiaoyu 390320151

    WuWaiwai 70271111

    WangXiaoai 3515064655

    3.

    [root@小马过河 files]# awk -F "[ :]+" '$1~/Zhang/{print $(NF-1),$2}' reg.txt

    100 Dandan

    90 Xiaoyu

    100 Dandan

    90 Xiaoyu

    [root@小马过河 files]# echo 12312312|tr "123" "abc"

    abcabcab

    4.

    [root@小马过河 files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $2,$NF}' reg.txt

    Xiaoyu $155$90$201

    4.6 -----------awk替换------------

    [root@小马过河 files]# awk '{gsub(/:/,"$",$NF);print $0}' reg.txt

    Zhang Dandan 41117397 $250$100$175

    Zhang Xiaoyu 390320151 $155$90$201

    Meng Feixue 80042789 $250$60$50

    ~  !~

    判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin),如果是显示用户名字

    [root@小马过河 files]# awk -F ":" '$NF!~/nologin$/{print $1}' /etc/passwd

    root

    sync

    shutdown

    [root@oldboyedu-40 files]# awk '{gsub(/:/,"$",$NF) ; print $0}' reg.txt |column -t
    Zhang  Dandan    41117397    $250$100$175
    Zhang  Xiaoyu    390320151   $155$90$201

     

    awk读取之前就执行

    4.7 ----企业案例3:统计/etc/services文件里面的空行数量---

    不用end显示过程

    用途:可以统计行数  

    [root@小马过河 files]# awk '/^$/' /etc/services |wc -l

    16

    [root@小马过河 files]# awk '/^$/' /etc/services |uniq -c

         16

    [root@小马过河 files]# awk '/^$/{i++} ; END{print i}' /etc/services

    16

    [root@小马过河 files]# awk '/^$/{++i} ; END{print i}' /etc/services

    16

    [root@小马过河 files]# awk '/^$/{i++} ; END{print i}' /etc/services

    16

    [root@小马过河 files]# awk '/^$/{i=i+1} ; END{print i}' /etc/services

    16

    用途: 可以对一列内容进行累加

    seq 10 >num.txt 计算这个文件每一行数字相加的结果 

    i=i+$0 ===累积相加 累加

    [root@oldboyedu-40 files]# awk '{i=i+$0;print i}' num.txt 
    1
    3
    6
    10
    15
    21
    28
    36
    45
    55
    [root@oldboyedu-40 files]# awk '{i=i+$0}END{print i}' num.txt 
    55

    [root@小马过河 files]# awk '{i=i+$0};END {print i}' num.txt

    5050

    [root@小马过河 files]# awk '{i=i+$1};END {print i}' num.txt

    5050

    算多少行,'{i++}END print i'

    算每行数量相加 '{i=i+$0($1)}END print i'

                   '{hotel[$2]++;END print hotel["www"]}'

            hotel[]数组,$2为awk找到的第二列内容,将它放进hotel数组作为变量,++为将数组里面的相同变量进行统计,然后统计结果作为变量值。

    4.8 --------awk 数组-----------

      '{hotel[$2]++;END print hotel["www"]}'

      '{hotel[$2]++}END {for (ma in hotel) print ma,hotel[ma]}'

    {hotel[$2]++}:hotel[]数组,$2为awk找到的第二列内容,将它放进hotel数组作为变量,++为将数组里面的相同变量进行统计,然后统计结果作为变量值。

    END:         没有的话就会显示awk命令执行过程

    for (ma in hotel):  定义变量ma 在数组hotel里

    print ma,hotel[ma] :  打印变量ma,以及变量值

    用途:(简化:计算列重复值)

    对ip地址去重并统计重复数

        即对一列重复的内容去重并统计重复数.

    [root@小马过河 files]# awk -F "[/]+" '{hao[$2]++}END{for (ma in hao)print hao[ma],ma}' 1

    1 mp3.etiantian.org

    2 post.etiantian.org

    3 www.etiantian.org

    定义数组,定义变量为数组元素,打印变量名及变量值

    [root@小马过河 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

     print hotel[110],hotel[119],hotel[121]}'

    lidao tanjiaoshou taojin

    [root@小马过河 files]#

    4.9 -------企业面试题1:统计域名访问次数----
    处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和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

    方法一:

    [root@小马过河 files]# cat 1

    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

    [root@小马过河 files]# awk -F "[/]+" '{print $2}' 1|sort|uniq -c|sort -r

          3 www.etiantian.org

          2 post.etiantian.org

          1 mp3.etiantian.org

    方法二:

    [root@小马过河 files]# awk -F "[/]+" '{hao[$2]++}END{for (ma in hao)print hao[ma],ma}' 1

    1 mp3.etiantian.org

    2 post.etiantian.org

    3 www.etiantian.org

    4.10 ---------awk统计的课后题-------

    echo  ;echo 可以不换行输出吗?

    课后题目:

    #secure.zip access.zip

    1.统计secure文件中谁在破解你的密码(统计出破解你密码的ip地址出现的次数)

    2.统计access.log文件中对ip地址去重并统计重复数

    3.统计access.log文件中网站一共使用了多少流量

    4.统计access.log文件中每个ip地址使用了多少流量

    1. awk统计有失败的ip并计算个数

    [root@小马过河 machangwei]# awk '$6~/Failed/{heike[$(NF-3)]++}END{for(ip in heike) print heike[ip]"      "ip }' secure-20161219|sort -nr

    68652      218.65.30.25

    34326      218.65.30.53

    21201      218.87.109.154

    18065      112.85.42.103

    17164      112.85.42.99

    17163      218.87.109.151

    17163      218.87.109.150

    2

    [root@小马过河 machangwei]# awk '{print $1}' access.log|sort|uniq -c|sort -nr|head

      12049 58.220.223.62

      10856 112.64.171.98

       1982 114.83.184.139

       1662 117.136.66.10

       1318 115.29.245.13

        961 223.104.5.197

        957 116.216.0.60

        939 180.111.48.14

        871 223.104.5.202

        869 223.104.4.139

    3.

    方法一:

    [root@小马过河 machangwei]# awk '{i=i+$10}END{print i}' access.log

    2478496663

    方法二:

    [root@小马过河 machangwei]# sh tt

    2478496663

    [root@小马过河 machangwei]# cat tt

    #!/bin/bash

    awk '{a[$1]++}{for (b in a)print b}' access.log >/machangwei/xiaoma

    for i in 'cat /machangwei/xiaoma'

    do

    awk -v i="BASH"  '/i/{d=d+$10}END{print d}' /machangwei/access.log

    done

    4.

    [root@小马过河 machangwei]# awk '{a[$1]=a[$1]+$10}{for(b in a)print b,a[b]}' access.log |head

    101.226.61.184 24662

    101.226.61.184 25188

    101.226.61.184 25188

    27.154.190.158 3084

    101.226.61.184 32579

    27.154.190.158 3084

    101.226.61.184 32579

    27.154.190.158 3084

    114.94.29.165 491

    101.226.61.184 44091

    [root@小马过河 machangwei]# seq 20|sort

    1

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    2

    20

    3

    4

    5

    6

    7

    8

    9

    [root@小马过河 machangwei]# seq 20|sort -nr

    20

    19

    18

    17

    16

    15

    14

    13

    12

    11

    10

    9

    8

    7

    6

    5

    4

    3

    2

    1

    4.11 ----------awk识别花括号加条件----

    awk --posix '/[0-9]{1,5}/' secure-20161219

     awk --re-interval '/[0-9]{1,5}/' secure-20161219

    假如现在有个文本,格式如下:

    a  1

    b  3

    c  2

    d  7

    b  5

    a  3

    g  2

    f  6

    d  9

    即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为:

    即将相同的字母后面的数字加在一起,按字母的顺序输出。

     

    a  4

    b  8

    c  2

    d  16

    f  6

    g  2

    4.12 ----- a[$1]=a[$1]+$2-----

    功能:某一列变化的有重复的内容对应另一列变化的数,将这个同一个东西的对应值累加并将两者对应打印出来

    [root@小马过河 machangwei]# awk '{a[$1]=a[$1]+$2}END{for (b in a)print a[b],b }' cc

    4 a

    8 b

    2 c

    16 d

    6 f

    2 g

    awk '{a[$1]=a[$1]+$2}END{for (b in a)print a[b],b }' cc

    {a[$1]=a[$1]+$2: 数组中很多变量,$1中第i个变量加上$2赋值给后一个第i个变量,实现第i个变量对应的$2的统计和,然后将统计和作为变量i的值

    for (b in a) :     定义变量在数组a里

    print a[b],b :     打印变量值,变量

    4.13 5. ip出现次数及使用流量

    [root@oldboyedu-40 files]# awk '{count[$1]++;sum[$1]+=$10}END{for(pol in count)print pol,count[pol],sum[pol]}' access.log |column -t|sort -rnk3 |head 
    114.83.184.139   1982   31362956
    117.136.66.10    1662   22431302
    116.216.30.47    506    21466000

    [root@oldboyedu-40-nb files]# awk 'BEGIN{print "访问次数","使用流量","ip地址"}{ss[$1]++;mm[$1]+=$10}END{for(nn in mm)print ss[nn],mm[nn],nn}' access.log |sort -n|column -t|head

    访问次数  使用流量  ip地址

    1         0         101.226.65.105

    1         0         110.75.105.135

    1         0         110.75.105.47

    1         0         110.75.87.144

    [root@小马过河 machangwei]# awk '{ips[$1]++;sum[$1]+=$10}{for(b in ips)print b,ips[b],sum[b]}' access.log |head

    101.226.61.184 1 24662

    101.226.61.184 2 25188

    [root@files]# awk '{sums[$1]+=$10;sus[$1]++}END{for (sum in sums) print " 访问ip===> " sum " ip访问次数=====> " sus[sum] " 每次访问的流量 "sums[sum]/sus[sum]/1024"K"  " 总流量: "sums[sum]}' access.log |sort -nrk6 | head |column -t

    访问ip===>  182.18.102.159   ip访问次数=====>  3   每次访问的流量  242.575K  总流量:  745189

    访问ip===>  180.97.182.222   ip访问次数=====>  1   每次访问的流量  185.885K  总流量:  190346

    访问ip===>  124.156.66.72    ip访问次数=====>  2   每次访问的流量  185.791K  总流量:  380500

    访问ip===>  223.104.211.140  ip访问次数=====>  2   每次访问的流量  130.531K  总流量:  267327

    访问ip===>  101.86.13.161    ip访问次数=====>  17  每次访问的流量  97.4069K  总流量:  1695660

    访问ip===>  101.87.174.78    ip访问次数=====>  42  每次访问的流量  95.2861K  总流量:  4098063

    访问ip===>  202.111.6.229    ip访问次数=====>  3   每次访问的流量  95.2354K  总流量:  292563

    访问ip===>  61.171.38.1      ip访问次数=====>  74  每次访问的流量  92.072K   总流量:  6976851

    访问ip===>  66.249.82.181    ip访问次数=====>  3   每次访问的流量  84.0768K  总流量:  258284

    访问ip===>  125.86.90.242    ip访问次数=====>  19  每次访问的流量  82.5421K  总流量:  1605939

    效果图

    不用两个for就是这样,不好放在一起

    4.14 ------awk 中的begin----------

    可以|""里里面加内容,先begin,再中间,再end,如果|加在整个命令前面,begin里的内容也会加入,比如排序

    [root@oldboyedu-40 files]# awk 'BEGIN{print "ip","count"}{count[$1]++}END{for(pol in count)print pol,count[pol]|"sort -rnk2"}' access.log  |head |column -t 
    ip              count
    58.220.223.62   12049
    112.64.171.98   10856
    114.83.184.139  1982
    117.136.66.10   1662
    115.29.245.13   1318
    223.104.5.197   961
    116.216.0.60    957
    180.111.48.14   939
    223.104.5.202   871

    4.15 ------------awk版本4以上有替换功能-----

    [root@小马过河 machangwei]# awk --version

    GNU Awk 3.1.7

    Copyright (C) 1989, 1991-2009 Free Software Foundation.

     

    This program is free software; you can redistribute it and/or modify

    it under the terms of the GNU General Public License as published by

    the Free Software Foundation; either version 3 of the License, or

    (at your option) any later version.

     

    This program is distributed in the hope that it will be useful,

    but WITHOUT ANY WARRANTY; without even the implied warranty of

    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

    GNU General Public License for more details.

     

    You should have received a copy of the GNU General Public License

    along with this program. If not, see http://www.gnu.org/licenses/.

    第5章 ---------总结大集合-----

    cpu一个内核同时只能做一个事情,我们看到他做很多事是因为它不断切换的。比如一个人做会这件事,做会儿那件事,把做事时间无限缩短,相当于同时在做很多事情。

    reinstall

    5.1 -------查看端口总结  踢死了妮妮(tslnn)-------

    查看端口是否开启五个:踢死了妮妮(tslnn),telnet,ss(netstat),lsof,nmap,nc

    查看22端口是否开启  
    1.telnet 
    telnet 10.0.0.200 22 
    2.ss 
    ss -lntup|grep 22 
    ss === netstat 
    3.lsof 
    lsof -i:22 
    4.nmap 
    [root@oldboyedu-40 files]# nmap -p22 10.0.0.200
    PORT   STATE SERVICE
    22/tcp open  ssh

    Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds
    [root@oldboyedu-40 files]# nmap -p25 10.0.0.200
    PORT   STATE  SERVICE
    25/tcp closed smtp

    Nmap done: 1 IP address (1 host up) scanned in 2.61 seconds

    5.
    [root@oldboyedu-40 files]# nc 10.0.0.200 22
    SSH-2.0-OpenSSH_5.3

    Protocol mismatch.



    ps -ef |grep sshd #进程是否在运行


    yum install telnet tree lrzsz  nmap nc  dos2unix -y

    5.2 ----------- 排查无法上网总结  3p-----

    2)linux无法上网
       1]  ping  www.baidu.com 

     #是否能上网
       2]  ping  223.5.5.5 

         #DNS是否有问题
       3]  ping 网关          #
        

    --------查看系统默认网关
    route -n  =====      

    ifconfig 
    ip a 
    ifconfig eth0 
    ip a s eth0 
    ip address show eth0

    route -n
    ip route
    ip r

    5.3 --------------  vi/vim快捷方式总结----

    vi/vim快捷方式

        移动光标:

               快速的达到文件的最后一行 G(shift+g)

               快速达到文件的第一行     gg

               快速达到文件的第100行 100gg     :100

            移动光标到行首       0 ^

            移动光标到行尾       $

           

        编辑:

            复制                               yy

            粘贴                               p

            剪切/删除当前行                    dd

            删除光标所在位置到文件的最后一行   dG

            删除光标所在位置到行尾             D   === d$ 

            把光标移动到文件的结尾并进入编辑模式   A

            在当前行下面插入一个空行并进入编辑模式 o(小写字母O)

            删除光标所在位置的一个字符         x

            撤销                               u

           

           

        查找替换:

        :1,10s#oldboy#oldgirl#g

        :.,$s#oldboy#oldgirl#g    #.表示当前行

        :%s#oldboy#oldgirl#g      #1,$====%

            查找替换移动:

        :1,10s#oldboy#oldgirl#g

        :.,$s#oldboy#oldgirl#g    #.表示当前行

        :%s#oldboy#oldgirl#g      #1,$====%

        :1,5m[ove]10              #从第一行到底5行移动到第10行

        :1,5co[py]10              #从第一行到底5行复制到第10行

        批量操作:(可视块模式)

        ctrl+v

        ctrl+v 按I 编辑  按esc

       

        其他:

        /搜索的内容   继续搜索n    继续向上搜索N   

          显示行号     :set nu

          取消显示行号 :set nonu

    s

    5.4 ---sed总结--------

    1.sed '找谁干啥'

    删改查

    d s p

    5.5 ------awk总结---------

    3.awk '找谁{干啥}'

    NR==1

    NR==1,NR==20

    正则表达式

    /oldboy/

    $2~/oldboy/

    NR>=20

    $3>20

    print

    gsub(/找谁/,"替换为什么",在哪个部分)

    计算

    i=i+1   i++

    i=i+$2  i+=$2

    h[$1]=h[$1]+1   h[$1]++

    h[$1]=h[$1]+$2  h[$1]+=$2

    [root@oldboyedu-40 files]# awk 'BEGIN{for(i=1;i<=100;i++) sum=sum+i;print sum}'

    5050

    2.shell

    变量分类

    read

    循环和判断

    5.6 ------rename-----

    [root@小马过河 ~]# rename bb "cc" bb

    [root@小马过河 ~]# ls

    1.txt            c     d035      ett.txt  install.log         lrzsz-0.12.20.tar.gz  passwd.txt  stu.sh

    2.txt            cc    data      f032     install.log.syslog  ma                    person.txt  tandao

    anaconda-ks.cfg  d032  download  f035     lrzsz-0.12.20       machangwei            services    x.t

    [root@小马过河 ~]# rename x "e" *.t

    [root@小马过河 ~]# ls

    1.txt            c     d035      e.t      f035                lrzsz-0.12.20         machangwei  services

    2.txt            cc    data      ett.txt  install.log         lrzsz-0.12.20.tar.gz  passwd.txt  stu.sh

    anaconda-ks.cfg  d032  download  f032     install.log.syslog  ma                    person.txt  tandao

    别人给的一道题:第三行求和

    [root@db01 ma]# vim ma.txt 
    sojfopsjfpsj
    sfjpsjpf
    3432

    方法一:

    [root@db01 ma]# sed -n "3s#.#&
    #gp" ma.txt|awk '{i=i+$0}END{print i}' 
    12
    

      

    方法二:

    [root@db01 ma]# vim 3.sh 
    sum=0
    shu=`awk NR==3  ma.txt|wc -L`
    for i in `seq 1 $shu`
    do
        j=` awk NR==3  ma.txt|cut -c $i`
        let sum=sum+j
    done
    echo $sum
    

      

                                              

  • 相关阅读:
    hdu 4685(强连通分量+二分图的完美匹配)
    图的连通性问题
    poj 1904(强连通分量+完美匹配)
    poj 2186 "Popular Cows"(强连通分量入门题)
    poj 1236(强连通分量分解模板题)
    EOJ2018.10 月赛
    21.Merge Two Sorted Lists
    20.Valid Parentheses
    19.Remove Nth Node From End of List
    18.4Sum
  • 原文地址:https://www.cnblogs.com/machangwei-8/p/8475510.html
Copyright © 2020-2023  润新知