20160203之前作业

 

1、  描述centos6系统开机启动流程;2、  描述/etc/rc.d/sysinit脚本功能;

       

        http://lisoy79.blog.51cto.com/10836537/1733265 

 

 3,sed:stream editor流编辑器,行编辑器,逐行处理数据

      用法:

          sed [OPTION]... {script-only-if-no-other-script} [input-file]...

          pattern space:模式空间,把文本符合定界的行逐行读取到一个内存空间存放处理,然后通过输出流输出到屏幕

          script:

         

     常用选项:

          -n,静默模式,不输出模式空间中的内容到屏幕;

          -e:多点编辑功能;一个命令中实现多个操作

         -f /path/to/somefile:从文件中读取事先编辑存成文件的脚本

          -r:支持使用扩展正则表达式

          -i:编辑原文件,修改原文件

    地址定界:

1,不给地址;对全文处理;

              2,单地址;

                          #:第几行

                   /pattern/:被模式匹配到的每一行;

             3,地址范围:

                         ##

                         #+#

                         /pat1/,/pat2/

                         #,/pat1/

                4 ~ 步进

                          1~2:读所有的奇数行:sed-n '1~2p' test.txt

                          2~2:读所有的偶数行:sed -n'2~2p' test.txt

        编辑命令:

                    d:删除 

                         sed'/^#/d'  /etc/fstab:  删除#开头的行

wKioL1ax1oTCVACMAAGGuRzcQ1o440.jpg

                       set '/^$/d' /etc/fstab:删除空白行

                       sed '1,4d' /etc/fstab:删除14

                    p:命令,显示模式空间中的内容,

                        sed  '/^UUID/p' /etc/fstab :打印内容两次

                        sed  -n '/^UUID/p' /etc/fstab :打印内容一次

                    a \text:在指定范围的行后面追加文本,支持\n实现多行追加;

                        sed '/^uuid/a \# hellosed \n welcome'  /etc/fstab   

                    i \text: 在指定范围内的之前添加新行,也支持\n添加多行

                        sed '/^uuid/i \# hellosed \n welcome'  /etc/fstab

                    c \text:替换行为单行或多行文本;

                         sed '/^uuid/c \# hellosed \n welcome'  /etc/fstab  

                           wKioL1ax1pzzHk1HAASklSFgaQw378.jpg

                    w  /path/to/filename:把符合范围内的模式空间中内容存到指定文件 

                         sed '/^uuid/w/tmp/fstab.txt  /etc/fstab  

                    =      :等于号:显示符合条件行的行号,为模式空间中的行打印行号

                             sed '/^uuid/='  /etc/fstab 

                    r /path/from/somefile:把指定文件读取到符合条件的模式空间中的行后

                         sed '6r/etc/issue'  /etc/fstab                 

                       :取反条件;对匹配到的行的其它行做编辑操作;

                           sed  '/^UUID/!d' /etc/fstab  :除了uuid开头的行之外都删除,对地址定界取反 

                    s/ / / :支持使用其他分隔符,s@@@s###;  查找替换命令;

                           替换标记:

                                g:行内全局替换

                                i:忽略大小写

                           sed'S@^UUID@uuid@'  /etc/fstab:大写uuid替换为小写

                       后向引用:

                            sed's@r..t@&er@g'  /etc/passwd:  r..t替换为..ter

                      仅显示被替换的行,替换成功则显示之  

                           sed -n's@r..t@&er@p' /etc/passwd :只显示被替换的行

                        

                        w /path/to/somefile:将替换成功的结果保存到指定文件中 

                         sed -n's@r..t@&er@w  /tmp/fs.txt'/etc/passwd  

 

  高级编辑命令:

         hold space: 保持空间

         patter space:模式空间

               h:用模式空间的内容覆盖到保持空间中

               H:把模式空间的内容追加至保持空间中

               g:从保持空间中取出内容覆盖至模式空间;

               G:从保持空间中取出内容追加到模式空间;

               x:把模式空间和保持空间的内容互换;

               n:读取匹配到的行的下一行至模式空间;会用下一行覆盖模式空间匹配到的行

               N:追加匹配到的行的下一行到模式空间:

               d:删除模式空间中的行;

               D:删除多行模式空间中的所有行

 

       

a.txt:

wKioL1ax1rnAmxd7AABu2DQv7DU948.jpg

           sed -n 'n;p' FILE :显示偶数行

           wKioL1ax1smhkISmAABiBrqWIT0469.jpg

           sed '1!G;h;$!d' a.txt :逆向显示文件内容

            wKioL1ax1tXShm6WAAByibzNZK4935.jpg 

           sed '$!N;$!D' a.txt:  取文件后两行;不是最后一行就追加,不是最后一行就删除模式空间

            wKiom1ax1pWg7s_YAAAZZtzoycA743.jpg

           sed '$!d'  a.txt: 取文件最后一行

            wKiom1ax1rCSYNJ7AAAYZXdafFM997.jpg

           sed 'G'  a.txt:每行后加入一个空白行

            wKioL1ax1wyTxfExAAB8-tCt5fE483.jpg

           sed 'g'  a.txt:全部替换为空白行

            wKioL1ax1xnQ-IzKAABbu-bAajU948.jpg

           sed '/^$/d;G'   a.txt:空白行删除后再加空白行,每个行后面加一个空白行

            wKioL1ax1yrQo6cWAAB5z2soX-g110.jpg

           sed 'n;d' a.txt: 显示奇数行

            wKioL1ax1zjiLtegAABtXavGyXA560.jpg

           sed -n '1!G;h;$p'  a.txt:逆序显示文件内容;

            wKioL1ax12qjnW-IAABp01eI4Uw690.jpg

            sed -i -n '1!G;h;$p'  a.txt:逆序显示文件内容,并修改原文件;

wKioL1ax15Hi6RRzAACf4Ah5AYs204.jpg

 

GUN awk:

        gawk - pattern scanning and processing language     文档报告生成工具:

 

    基本用法:

        gawk  [options]  'program' file ...

                    progarm: pattern{action statements}

                    statements语句之间用分号分隔

            print,printf

     选项:

            -F:指明输入时用到的字段分隔符;

            -v var=value:自定义变量

            cat /etc/fstab

            tail -5 /etc/fstab |awk '{print $2,$4}'

     输出命令:

          1pring  item1,item2,...

           注意:

              1,逗号做分隔符;

              2,输出的item可用是字符串,也可以是数值;也可是当前记录的字段,变量,awk的表达式;

                        tail -5 /etc/fstab |awk'{print “hello", $2,$4,6}'

                        tail -5 /etc/fstab |awk'{print “hello:", $1}'

              3,省略item,相当执行print$0;

                         tail -5 /etc/fstab|awk '{print }'

          2,变量:

              1,内置变量:

                 FS:input field seperator:输入分隔字段分隔符,默认空白

                 OFS: output field seperator,输出分隔字段分隔符,默认空白字符

                     awk '{print $1}'   /etc/passwd:显示所有内容,因为开始没有空白字符

                     awk -v FS=':'  '{print $1}' /etc/passwd 相当于: awk -F: '{print $1}' /etc/passwd

                     awk -v FS=':' -v OFS=':''{print $1,$3,$7}'  /etc/passwd :指定输出输入分隔符

                 RS:input record seperator,输入是的换行符号

                 ORS:output record seperator,输出的换行符;

                      awk -v RS=' ' -v ORS='#''{print}'  /etc/passwd

                 NF:number of field:每行的字段数量

                         awk '{print NF}'  /etc/fstab:统计每行有多少个字段;

                         awk '{print $NF}'  /etc/fstab :打印每行的最后一个字段;

                  NR:number of record:行数:

                         awk '{print NR}'  /etc/fstab :打印每行的行号。和行数

                  FNR:各文件分别计数行数;

                         awk '{print FNR}'  /etc/fstab /etc/issue:每个文件单独计数,

                         awk '{print $NF}'  /etc/fstab :打印每行的最后一个字段;

                  FILENAME:当前正在处理的文件名:

                         awk '{printFILENAME}'  /etc/fstab  :每行都显示一次文件路径和文件名

                         awk END'{printFILENAME}' /etc/fstab :只显示最后一次的路径和文件名

                  ARGC:命令行参数的个数

                         awk '{printARGC}'  /etc/fstab/   /etc/issue

                         awk BEGIN'{printARGC}'  /etc/fstab/   /etc/issue

                  ARGV:  数组,保存命令行中给定的各参数;  

                           awk BEGIN'{printARGV[0]}'  /etc/fstab/   /etc/issue

                           awk BEGIN'{print ARGV[1]}'  /etc/fstab/  /etc/issue

 

      2,自定义变量: 

            1 -v  var=value

                       变量名区分字符大小写;

            2,在program中直接定义  

                awk -v test='hello gawk'  '{print test}'  /etc/fstab :打印出/etc/fstab文件行数那么多的hello gawk

                awk -v test='hello gawk'  BEGIN'{print test}':只打印一次hellogawk

                awk BEGIN'{test="hellogawk"  ;print test}'

           3,printf命令:                   

                格式化输出:printfFORMAT,  item1,item2,...

                         1FORMAT是必须要给出  

                         2,不会自动换行,需要显示给出换行控制符: \n

                         3,FORMAT中需要分别为后面的每个item指定一个格式化符号;

                   格式符:

                            %c:显示字符的ascii

                            %d,%i:显示十进制整数;

                            %e,%E:显示科学计数法数值显示

                            %f:显示浮点数

                            %g,%G:科学计数或浮点数显示数值;

                            %s:字符串

                            %u:无符号整数;

                            %%:显示%号自己;

                    awk -F: '{printf"%s\n",$1}' /etc/passwd    

                    awk -F: '{printf"username: %s, UID: %d\n",$1,$3}' /etc/passwd  

                 修饰符:

                    #[.#]:第一个数字控制显示的宽度,第二个字符表示小数点后面的精度:默认右边对齐

                          %3.1f :三个字符宽度,一个小数点

                           awk -F: '{printf"username: %15s, UID: %3.1f\n",$1,$3}' /etc/passwd

                    -:表示左对齐   

                           awk -F: '{printf"username: %-15s, UID: %d\n",$1,$3}' /etc/passwd

                   +:显示数值的符号:

 

             4,操作符

                  算术运算操作符:+ - * /   ^次方,  %取模

                     -x:整数转负数

                     +x:字符串转为数值

                   字符串操作符:

                      没有符号的操作符,字符串链接;

                   赋值操作符: = +=-= *= /= %= ……=

                       ++ --

                   比较操作符:

                                > >=<= !=  ==

                    模式匹配符:

                             ~ :匹配,左侧的字符串是否能被右边的模式所匹配

                             !~:是否不匹配:左侧的字符串是否不能被右边的模式所匹配    

                    逻辑操作符:&&, ||, !

                 

 

                  条件表达式:

                      selector:挑选器,

        awk -F:'{$3>=500?usertype="common user":usertype="sysadmin orsysuser";pringf"%15s:%-s\n",$1,usertype}'  /etc/passwd

 

           5,PATTERN

                  类似地址定界符

                   1,   empty:空模式:处理文本的每一行,匹配任意行;

                   2/regulaarexpression/:能被表达式匹配到的行才被处理;

 awk '/^UUID/{print $1}'   /etc/fstab

                                     awk '!/^UUID/{print $1}'    /etc/fstab   

                  3,relationalexpression:关系表达式:结果有真有假,结果为真的才被处理,

                      真:结果为非0值,非空字符串: awk-F: '$3>=1000{pring $1,$3}'  /etc/passwd

                    /bash的用户:  awk -F: '$NF=="/bin/bash"{print$1,$NF} '  /etc/passwd

                     awk-F: '$NF~/bash$/ {print $1,$NF} ' /etc/passwd    :显示bash结尾的:

                  4line ranges:行范围地址定界:startline,endline:指定起始行号:

 awk -F:'(NR>=10&&NR<=20){print $1}' /etc/passwd

                    注意:不支持直接给出数字范围的格式

                     /pat1/,/pat2/:从模式1到模式2直接匹配到的行,

                       如: awk -F:'/^r/,/^u/{print $1}' /etc/passwd  

           5BEGIN/END模式:

                    BEGIN{}:表示仅在开始处理文件中的文本之前执行一次的程序;

                     END{};仅在文本处理完成之后命令结束之前处理执行一次;

             awk -F: 'BEGIN{print " username uid \n------"}{print $1,$3}END{print"=====\n end "}'/etc/passwd  

          

       6,控制语句:

           1 if-else

                语法:  if(condition) statement   [else statement]

                        awk -F: '{if($3>=1000) {printf "commonuser :  %s\n",$1} 

else { printf “roo or sysuser:%s\n",$1}}'  /etc/passwd

           2  while循环:

                语法:while(condition)  statement                         

                       awk'/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf $i,length($i);i++}}'/etc/grub2.cfg

                              

          3  do-while循环

               语法:  do statement while(condition)

                                      

         4 for循环

               语法:  for(expr1;expr2;expr3)  statement

                    awk'/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}'/etc/grub2.cfg  

                           

5  next:提前结束对本行的处理,直接进入下一行

                       awk -F: '{if($3%2!=0)next; print $1,$3}'   /etc/passwd

 7 array数组                              

        

       awk'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="tuesday";for (i in weekdays) {print weekdays[i]}}' 

                 

 

      8,函数                        

   9.1  内置函数

         数值处理:

             rand():返回01之间的随机数:

awk 'BEGIN{print rand()}'

          字符串处理:

          length([s]):返回指定字符串的长度;

           sub(r,s,[t]):表示以r所表示的模式来查找t所表示的字符串中的匹配的内容,

并将其第一次出来替换为s所表示的内容;

               awk -F: '{sub(o,O,$1)}'  /etc/passwd

 

4、写一个脚本,生成10个随机数,并按从小到大进行排序(要求至少使用2中方法)

     方法一:

wKioL1ax16qwsABXAAFqXoAPzZI925.jpg

方法二:

wKioL1ax17mQ5B4pAAEJ9WgY0pw840.jpg

 

5、在每周二的凌晨15分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中;

 crontab –e

  5 1* * 2 /data/get_username.sh >> /tmp/get_username.log

6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;

wKioL1ax193hiCXuAAFQoKPUqsk778.jpg

   7、写一个脚本,打印9X9乘法表;

wKioL1ax2D_Qj13bAAHnP2eqJsE077.jpg

   8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。

       DNS  http://lisoy79.blog.51cto.com/10836537/1735611