码迷,mamicode.com
首页 > 编程语言 > 详细

马哥笔记第十六天故障排除、trap、sed、awk、bash数组、bash字符串操作

时间:2015-04-24 01:14:55      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:trap、sed、awk、bash数组、bash字符串操作

A、故障排除
             紧急救援模式:rescue,相当于一个小型的linux系统和让你切换到硬盘系统中。

               1、grub损坏:  
                       谨慎操作 dd  if=/dev/zero of=/dev/sda count=1 bs=400   不能大于446,否则破坏分区表中数据。这时需要进入救援模式,选择Rescue installed system,选择语言、键盘设置、是否启用网络、继续continue、选择启动shell、使用chroot /mnt/sysimage/。进入硬盘系统,输入grub进入grub环境

                      grub> root (DEVICE,PART) 。指定盘符例如:root(hd0,0)
                      grub> setup (DEVICE)。重装grub,只能修复grub损坏。如果是缺少文件就需要用下面方式安装。
                      
                       在chroot后,grub-insertall /dev/sda:重装grub并生成grub文件和目录缺少grub.conf文件。
                       
              2、Bash
 损坏修复方法:

                       需要进入救援模式,重新安装bash。但现在没有bash所以直接切换chroot /mnt/sysimage会报错。所以在切换是需要指定其他sh切换例如:chroot /mnt/sysimage /bin/tcsh,挂载目录后执行安装rpm –ivh bash-xxxx.rpm –replacepkgs.替换模式重装bash。

                        或者不切换直接在救援模式下挂载镜像,但需要先创建目录,安装时需指定根例如:rpm –ivh bash-xxxx.rpm –replacepkgs –root=/mnt/sysimage因为系统根被救援模式临时挂载在/mnt/sysimage下。

            3、文件系统损坏:

                     进入紧急救援模式,编辑/etc/fstab禁止开机自动挂载

            4、驱动文件损坏

                    在grub模式下输入e建在kernel一行后面添加emergency:表示进入紧急模式。在紧急模式下不会执行/etc/rc.d/rc.sysinit。

        修复系统两种方式(紧急救援模式,grub下向内核传递参数(single, emergency))

        trap:bash内嵌命令用于信号捕捉SIGINT为"ctrl+c"。例如:trap "exit 3" SIGINT

B、sed流编辑器
           sed:stream editor,行编辑工具,把文件所有内容都保存到内存中,根据指令进行修改,最终显示到屏幕。
           地址:
                   行范围:
                              start_line[, end_line]:指定开始行和结束行。
                              /patten1/,/patten2/: 第一次被pattern1匹配到的行为开始,到第一次被pattern2匹配到的行为结束之间所有行;      
                    特定行:指定匹配到的行。例如:sed -n ‘#p‘ /etc/fstab 显示所有包含#的行 

           编辑命令:命令可在之前加!取反。例如:sed ‘/^#/!d‘ fstab。删除#开头以外的行
                   p:把匹配到的内容显示出来。例如:sed ‘2,5p‘ /etc/passwd
                   d:删除指定行。例如:sed ‘4,11d‘ /etc/fstab
                   i:\text 行上方插入text文件内容。例如:sed -r ‘/^([[:upper:]]|d)/i \abcdefg‘ fstab。
                   a:\text: 行下方插入。例如:sed -r ‘/^([A-Z]|d)/a \abcdefg \ntest‘ fstab。支持用\n换行
                   r:在指定行插入文本。例如:sed -r ‘/^d/r /etc/passwd‘ fstab。在d开头的行插入passwd文件中的内容
                  w:保存文件到指定目录。例如:sed -n ‘/^[^[:punct:]]/w /tmp/text‘ fstab。不显示以特殊字符开头的行保存到tmp下text
                  =:显示匹配行的行号。例如:sed -n ‘/^#/!=‘ fstab 显示非#开头的行号
                  s///:支持字符替换。例如:sed ‘s/proc/xxxx/g‘ fstab,所有proc替换为xxxx。g替换所有。i不区分大小写 
          选项:
                   -n: 静默模式,不显示模式空间中的内容,只显示匹配到的内容。例如:sed -n ‘2,5p‘ /etc/passwd
                   -r:支持扩展正则表达式,例如:sed -r -n ‘/^([[:upper:]]|d)/p‘ fstab 非扩展:sed -n ‘/^\([A-Z]\|d\)/p‘ fstab
                   -i:直接修改原文件,不显示到屏幕
                   -e:可以执行多个命令。例如:sed -n -e "s/id:3:/id:5:/" -e "/^id:/p" /etc/inittab

          练习:
                    替换/etc/inittab中的"id:3:initdefault"一行数字为5;sed -n -e "s/id:3:/id:5:/" /etc/inittab
                    删除/etc/init.d/functions的空白行: sed  "/^[[:space:]]*$/d" /etc/init.d/functions
                    删除/boot/grub/grub.conf文件中行首的空白字符:sed "s@^[[:space:]]\{1,\}@@g" /boot/grub/grub.conf
                    echo一个路径给sed,通过sed取出其目录名;例如echo "/etc/sysconfig/" | sed,返回/etc: 
                    echo ‘/etc/inittab/‘ | sed ‘s@[^/]\{1,\}/\?$@@‘。我用""报错因为中间有$符

 awk基本应用
        可以实现对文件中每一行内容的每个字段分别进行格式化,然后显示。支持使用:变量(内置变量、自定义变量)、循环、条件、数组
         使用基本格式:awk ‘{print $2}‘ /etc/inittab,不要使用""

        地址范围:和sed相同
               表达式:>, >=, ==, <, <=, !=, ~    例如:awk -F: ‘$3 >= 400 {print $0}‘ /etc/passwd 
                           awk -F: ‘$NF~/bash/ {print $0}‘ /etc/passwd:模式匹配最后一个字段里包含bash内容的行
               BEGIN模式:在{action}开始之前执行一次;一般用在显示表头或初始化变量  这里只能使用""不能使用‘‘
                        
awk -F: ‘BEGIN {print "username shell"}$NF~/bash/ {print $1,$7}‘ /etc/passwd
               END模式:在{action}结束之后执行一次;通常使用在收尾工作或指定表尾     
                        awk -F: ‘BEGIN {print "username shell"}$NF~/bash/ {print $1,$7}END{print "======="}‘ /etc/passw

        内置变量:$0:显示整行、$1:显示第一个字段、NF:显示一共有多少个字段、$NF:显示最后一个字段
               FS: Field Seperator,输入分隔符;也可以使用-F:分隔,默认为空白符
                     例如:awk ‘BEGIN {FS=":";OFS="/"}$NF~/bash/ {print $1,$7}‘ /etc/passwd 
               OFS:输出时的字段分隔符。
                    例如:awk -F: ‘BEGIN {OFS="/"}{print $1,$7}‘ /etc/passwd

        引用变量的值,不需要以$开头,所有以$开头的变量,是用于引用awk分割后字段的值;
        练习:
                显示gid小于500的组:awk -F: ‘$4<500{print $0}‘ /etc/passwd
                显示默认shell为nologin的用户:awk -F: ‘$NF~/nologin/{print $NF}‘ /etc/passwd匹配模式时要加/
                显示eth0网卡配置文件的配置信息,只显示=号后的内容:awk -F= ‘{print $2}‘ /etc/sysconfig/network-scripts/ifcfg-eth0
                显示/etc/sysctl.conf文件定义的内核参数的参数名:awk -F= ‘{print $1}‘ /etc/sysctl.conf | grep -v "^#"
                显示eth0网卡的ip地址:ifconfig eth0 | awk -F: ‘/inet addr/{print $2}‘ | awk ‘{print $1}‘

C、bash编程:
           循环控制:
                   continue:跳出本次操作。
                   break:跳出本循环

           bash随机数生成器$RANDOM

            数组:数组名+索引
                      索引的表示方式:数字索引:a[index]。例如:a[0], a[1]
                                                 bash 4.0以后支持关联数组.用declare -A指明是关联数组例如:a[hello], a[hi]
                      在引用是必须使用{}。例如${a[0]}

            bash中只支持一维数组,支持稀疏格式。
                     一次对多个元素赋值。例如:a=(red blue yellow green)
                     按索引进行赋值。例如:a=([0]=green [3]=red [2]=blue [6]=yellow)
                     命令替换赋值。例如:d=($(ls /opt/script/))或d=(/etc/sysconfig/network-scripts/*)
                     用户输入赋值。例如:read -a c,赋值后用echo ${c[0]}查看
              
             bash取值:
                     echo ${#d[2]}获取这个数组字符的个数
                     echo ${#d[*]}或echo ${#d[@]}获取这个数组中数组个数。    

             从数组中挑选某元素:   
                      ${ARRAY[@]}: 取出所有元素。例如:echo ${d[@]}           
                      ${ARRAY[@]:offset:number}。例如:echo ${d[@]:1:1}
                                    offset: 偏移的元素个数
                                    number: 取出的元素的个数 
                      ${ARRAY[@]:offset}:取出偏移量后的所有元素 。例如:echo ${d[@]:1}
                      

              向数组追加元素:
                      把数组中的个数当做该数组的下标。
                                  declare -a mylogs
                                  tmp=${#mylogs[@]}
                                  mylogs[$tmp]="dasd"
                            
                      删除数组用的元素:unset d[i]

            练习:写一个脚本,生成10个随机数,保存至数组中;而后显示数组下标为偶数的元素;     

for i in {1..10};do

     A[$i]=$RANDOM

       if [ $[ $i % 2 ] -eq 0 &>/dev/null ];then

           echo "${A[$i]}"

       fi

done


                     生成10个随机数,升序排序

for i in {1..5};do
     arr[$i]=$RANDOM
done
echo "${arr[@]}"
for ((z=${#arr[@]};$z>0;z--));do
     for ((x=0;$x<$z;x++));do
         if [ ${arr[$x]} -gt ${arr[$[$x+1]]} &>/dev/null ];then
echo "${arr[$x]}"
echo "${arr[$[$x+1]]}"
          tme=${arr[$[x+1]]}
          arr[$x+1]=${arr[$x]}
          arr[$x]=$tme
         fi
     done
done
echo "${arr[@]}"

                     打印九九乘法表

for ((i=1;i<=9;i++));do
    for ((z=1;z<=$i;z++));do
         let tmp="$i*$z"
         arr[$z]="$i*$z=$tmp"
    done
         echo "${arr[@]}"
done


D、bash字符串操作:

         字符串切片:${string:offset:length}。例如:${d[1]:0:5}可以对该数组内1的变量截取0-5个字符串。

         取尾部的指定个数的字符:${string: -length},中间需要有个空格,从右向左取多少个字符。例如echo ${string: -3}

         取子串:
               基于非贪婪模式:${variable#*word}:从左向右截取第一次出现该字符串后的值例如:echo ${string#*a}
               基于贪婪模式:${variable##*word}:从左向右截取最后一次出现该字符串后的值例如:echo ${string#*a}
               ${variable%word*}:从右向左取第一次出现该字符串后的值。例如:echo ${string%a*}
               ${variable%word*}:从右向左取最后一次出现该字符串后的值。例如:echo ${string%%a*}

         查找替换:

               ${variable/pattern/substi}: 替换第一次出现。例如:echo ${userinfo/d/xxx}
               ${variable//pattern/substi}:替换所有的出现。例如:echo ${userinfo//d/xxx}
               
${variable/#pattern/substi}:只替换行首echo ${userinfo/#d/xxx}
               ${variable/%pattern/substi}:只替换行尾echo ${userinfo/%d/xxx}

          查找删除:

                ${variable/pattern}删除第一次出现的字符
${variable//pattern}删除所有出现的字符
${variable/#pattern}删除行首出现的字符
${variable/%pattern}删除行尾出现的字符

         大小写转换:

                
小-->大:${variable^^}。echo ${userinfo^^}
                
大-->小:${variable,,}。echo ${userinfo,,}

         变量赋值:
            
                ${parameter:-word}:如果变量值为空将显示指定字符串,不空显示自身已有值,变量本身值不变。例如:${string:-test}
                ${parameter:=word}:如果变量值为空将显示指定字符串,不空显示自身已有值,变量将被赋值。例如:${string:=test}
                ${parameter:?word}:如果变量为空将把指定字符串作为错误信息显示,有值将显示值本身。${string:?xxxx} 
                ${parameter:+word}:如果变量有值将显示指定字符串,为空将显示空,变量本身值不变。例如:${string:+xxxx}

         命令:
                mktemp:可以创建带随机数的文件名例如:mktemp /tmp/abc.XXXX,-d可以创建目录。
                install:增强型复制命令可以复制文件并指定权限和属组。可以创建目录
                         -o:设定属主。例如:install -o root /etc/passwd ./
                         -g:设定属组。例如:install -g  /etc/passwd ./
                         -m:设定权限。例如:install -m 500 -g test -o test /etc/passwd ./
                         -d:创建目录。例如:install -m 755 -d basd

练习:

        使用install创建目录/tmp/test;
                install  -d /tmp/test

在/tmp/test目录创建多个以.txt和.doc结尾的文件;
                mktemp XXXXX.doc
                mktemp XXXX.txt

将.txt结尾的文件的文件名后缀改为.TXT;.doc的改为.DOC (使用bash内置的字符串处理机制)
              arr=(/tmp/test/*)
              echo ${arr[@]/txt/TXT}
              echo ${arr[@]/doc/DOC}





马哥笔记第十六天故障排除、trap、sed、awk、bash数组、bash字符串操作

标签:trap、sed、awk、bash数组、bash字符串操作

原文地址:http://5990383.blog.51cto.com/5980383/1637717

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!