linux坏的数组下标,马哥笔记第十六天故障排除、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/sysp_w_picpath/。进入硬盘系统,输入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/sysp_w_picpath会报错。所以在切换是需要指定其他sh切换例如:chroot /mnt/sysp_w_picpath /bin/tcsh,挂载目录后执行安装rpm –ivh bash-xxxx.rpm –replacepkgs.替换模式重装bash。

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

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相同

表达式:>, >=, ==, = 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

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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值