标签: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