shell——精选推荐

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

shell
1、shell简介
shell是⼀个命令解释器,它在操作系统的最外层,负责直接与⽤户对话,把⽤户的输⼊解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给⽤户。

这种对话⽅式可以是交互的⽅式(从键盘输⼊命令,可以⽴即得到shell的回应),或⾮交互(脚本)的⽅式。

换句话说,Shell是⼀个命令⾏解释器,它为⽤户提供⼀个像Linux内核发送请求以便运⾏程序的界⾯系统级程序,⽤户可以⽤Shell来启动,挂起,停⽌甚⾄是编写⼀些程序。

Shell还是⼀个功能相当请打的编程语⾔,易编写,易调试,灵活性较强。

Shell是解释执⾏的脚本语⾔,在Shell中可以直接调⽤Linux系统命令。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2、shell变量
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.1 什么是变量:变量就是⽤⼀个固定的字符串(也可能是字符、数字等组合)代替更多更复杂的内容,该内容可能还会包含变量、路径、字符串等其他路径。

2.2 变量分类:环境变量(全局变量)和普通变量(局部变量)
2.2.1 普通变量
定义变量和打印变量⽰例:
删除变量:unset 变量名
2.2.2⾃定义环境变量
设置环境变量环境变量名通常要⼤写
<== 查看环境变量set、env、declare
删除环境变量:unset 变量名
(1)⽤户环境变量配置⽂件:/root/.bashrc
(2)全局变量配置⽂件:/etc/profile
/etc/bashrc #<==推荐此⽂件优先设置
/etc/profile.d/
2.2.3设置登录提⽰
<==在/etc/motd ⽂件中加⼊提⽰语即可
2.2.4变量定义及变量输出说明
单引号:所见即所得。

双引号:弱引⽤,输出所有内容,如果内容中有命令(要反引下)、变量、特殊字符要转义。

反引号:引⽤命令。

注意:这⾥仅为Linux shell下的结论
⽰例:
[root@localhost ~]# echo 'today is date' <==单引号,所见即所。

today is date
[root@localhost ~]# echo 'today is `date`' <==单引号引起内容时,内部有命令通过反引号引起来也没⽤。

today is `date`
[root@localhost ~]# echo "today is `date`" <==⽤双引号,内部有命令通过反引号引起来有⽤。

today is Fri Oct 27 17:49:44 CST 2017
[root@localhost ~]# echo "today is date" <==双引号,输出说有。

today is date
[root@localhost ~]# echo today is $(date) <==$()相当于 ` ` 。

today is Fri Oct 27 17:50:37 CST 2017。

2.2.5针对AWK调⽤shell变量,使⽤引号情况介绍
1、赋值不加引号
[root@localhost ~]# a=123 <==定义变量a,并赋值123,没加引号。

[root@localhost ~]# awk 'BEGIN {print "$a"}' <==加双引号引⽤$a,输出本⾝。

$a
[root@localhost ~]# awk 'BEGIN {print $a}' <==不加引号引⽤$a,输出空。

[root@localhost ~]# awk 'BEGIN {print "'$a'"}' <==给$a加单引号,再加双引号,输出结果。

123
2、赋值加单引号
[root@localhost ~]# a='666' <==定义变量a,并赋值666,加单引号。

[root@localhost ~]# awk 'BEGIN {print "$a"}'
$a
[root@localhost ~]# awk 'BEGIN {print $a}'
[root@localhost ~]# awk 'BEGIN {print "'$a'"}'
666
[root@localhost ~]# awk 'BEGIN {print '$a'}' <==加单引号,输出结果。

666
3、赋值加双引号
[root@localhost ~]# a="666" <==定义变量a,赋值666,加双引号。

[root@localhost ~]# awk 'BEGIN {print "$a"}'
$a
[root@localhost ~]# awk 'BEGIN {print $a}'
[root@localhost ~]# awk 'BEGIN {print '$a'}' <==给$a加单引号,再加双引号,输出结果。

666
[root@localhost ~]# awk 'BEGIN {print "'$a'"}'
666
4、赋值加反引号
[root@localhost ~]# a=`pwd`
[root@localhost ~]# echo $a
/root
[root@localhost ~]# awk 'BEGIN {print $a}'
[root@localhost ~]# awk 'BEGIN {print "$a"}'
$a
[root@localhost ~]# awk 'BEGIN {print '$a'}'
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unexpected newline or end of string
[root@localhost ~]# awk 'BEGIN {print "'$a'"}'
/root
结论:不管变量如何定义赋值,在AWK取⽤shell变量时,我们更喜欢先⽤echo加符号输出变量,然后通过管道给awk,进⽽控制变量的输出结果。

举例如下:
[root@localhost ~]# a="rookie"
[root@localhost ~]# echo $a | awk '{print $1}'
rookie
[root@localhost ~]# echo $a | awk '{print $0}'
rookie
2.2.6变量定义总结
(1)变量名为只能为字母、数字、下划线,只能以字母或下划线开头。

(2)变量名定义要规范,并且见名知意。

(3)⼀般变量定义、赋值⽤双引号,简单连续字符可以不加引号。

(4)希望解析变量结果⽤反引号或$().
2.3 shell中特殊且重要的变量
2.3.1位置参数变量
$0 获取当前执⾏shell脚本的⽂件名。

$n 获取当前执⾏的shell脚本的第⼏个参数,n=1....9,n>9时,⽤花括号括起来例:${10}
$# 获取当前执⾏shell脚本后⾯接的参数的总个数。

$* 获取当前shell脚本所有传参的参数,不加引号和$@相同。

$@ 获取当前shell脚本参数所有传参的参数,不加引号和$*相同。

例如:"$@" 相当于"$1" "$2"... 表⽰独⽴字符串。

当"$@"和"$*"都加引号时,两者有区别,都不加,两者⽆区别。

2.3.2 shell进程中特殊状态变量
$? 获取执⾏上条指令的执⾏结果返回值(0为成功,⾮0失败),⽤于判断上条命令执⾏是否成功。

常⽤命令
$$ 获取当前执⾏的shell脚本的进程号(PID)。

不常⽤
$! 获取上⼀个后台⼯作进程的进程号(PID)。

不常⽤
$_ 获取在此之前执⾏的命令或脚本最后⼀个参数。

不常⽤
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3、变量数值运算
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.1算数运算符
双⼩括号的使⽤⽅法
let 命令⽤法:
[root@localhost ~]# i=2
[root@localhost ~]# let i=i+8
[root@localhost ~]# echo $i
10
提⽰:let i=i+8等同于((i=i+8)),但后者效率更⾼。

expr命令⽤法:
[root@localhost ~]# expr 2+2 <==注意数字与符号间要有空格
2+2
[root@localhost ~]# expr 2 + 2
4
[root@localhost ~]# expr 2 - 2
[root@localhost ~]# expr 2 * 2 <==*要⽤ \ 转义
expr: syntax error
[root@localhost ~]# expr 2 \* 2
4
[root@localhost ~]# expr 2 / 2
1
bc命令⽤法:
[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+2 <== 输⼊后按回车
3
2*3
6
例1:此⽅法效率低,不推荐使⽤
[root@localhost ~]# i=5
[root@localhost ~]# i=`echo $i+6 | bc`
[root@localhost ~]# echo $i
11
AWK实现计算
[root@localhost ~]# echo "3.4 2.9" | awk '{print ($1-$2)}'
0.5
[root@localhost ~]# echo "3 9" | awk '{print ($1+6)}'
9
[root@localhost ~]# echo "334 21" | awk '{print ($1-300)/$2}'
1.61905
[root@localhost ~]# echo "334 21" | awk '{print ($1-300)*$2}'
714
declare(同typeset)命令⽤法
[root@localhost ~]# declare -i A=20 B=19 <== -i参数可以将变量定义为整形
[root@localhost ~]# A=A+B
[root@localhost ~]# echo $A
39
$[]符号运算
[root@localhost ~]# echo $i
10
[root@localhost ~]# echo $[2*3]
6
[root@localhost ~]# echo $[2**3]
8
[root@localhost ~]# echo $[2/3]
[root@localhost ~]# echo $[3/2]
1
[root@localhost ~]# echo $[3%2]
1
[root@localhost ~]# echo $[1%2]
1
[root@localhost ~]# echo $[3%5]
3
read命令
语法格式:read [参数] [变量名]
常⽤参数: -p prompt 设置提⽰信息。

-t timeout 设置输⼊等待时间,默认单位秒。

例:
[root@localhost ~]# read -p "please input one num:" num
please input one num:666
[root@localhost ~]# echo $num
666
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4 、shell脚本条件测试与⽐较
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4.1条件测试
注意事项:1、语法⼀中test命令和语法2中的[] 等价。

语法3中[[]]为扩展test命令。

语法4中()())常⽤于计算。

2、[[]]中可以使⽤通配符等进⾏模式匹配,这是其区别于其他语法。

3、&&、||、>、< 等操作符可以应⽤在[[]]中。

-a、-o、-gt、-lt、-eq、-ne、-ge、-le 代替以上操作符。

4、对于整数的关系运算,也可以⽤shell的算数运算符(())。

test<测试表达式>⽰例:
[root@localhost ~]# test -f file && echo true || echo false
true
[<测试表达式>] ⽰例:
[root@localhost ~]# [ -f /test/file1 ] && echo 1 || echo 0
[[<测试表达式>]] ⽰例:
[root@localhost ~]# [[ -f /test/file1 ]] && echo 1 || echo 0
4.2 ⽂件测试
这些操作符对于[[]] 、[] 、test的测试都是通⽤。

4.3 特殊条件测试
4.4 字符串测试表达式
4.4.1 字符串测试操作符
提⽰:1对于字符串测试,⼀定要将字符串加引号之后在⽐较。

如[ -n "ahjhfhe" ].
2、⽐价符号两端⼀定要有空格。

3、“!=”和‘=’可⽤于⽐较两个字符串是否相同。

4.5 整数⼆元⽐较操作符
4.6 逻辑操作符
4.7 测试表达总结
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5、if条件语句
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5.1、单分⽀结构
语法:
if 条件
then
命令序列
fi
if 条件;then
命令序列
fi
复合命令:条件满⾜时,执⾏若⼲个命令
使⽤{}或者()
书写规则:
(list) 在⼦shell中执⾏命令列表
{ list} 在当前shell中执⾏命令列表,指令写在⼀⾏{必须有空客,最后⼀个指令以;结束。

⽰例1:两个整数⽐较⼤⼩
⽰例2:测试脚本执⾏者,若不是root⽤户,给出提⽰后则退出。

退出 exit 1
思路:
1、使⽤系统环境变量做判断 USER UID
2、使⽤命令结果做判断
whoami、id -u
⽰例3:判断系统内存剩余⼤⼩,低于200M邮件报警。

5.2、双分⽀结构
语法:
if 条件
then
命令1
else
命令2
fi
⽰例4:双分⽀if条件语句整数⽐较⼤⼩
⽰例5:判断脚本⽬录是否存在,存在打印⽬录存在信息,否则创建⽬录。

⽰例6:判断⽬标主机是否存活,显⽰检测结果
ping -c 3 -i 0.2 -W 3 192.168.1.111 &> /dev/null
检测web服务器是否正常访问,正常显⽰检测结果,异常重启apache。

5.3.多分⽀结构
语法:
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令n
fi
判断当前主机的CPU⽣产商,其信息在/proc/cpuinfo⽂件中vendor_id⼀⾏中。

如果其⽣产商为GenuineIntel,就显⽰其为Intel公司;
如果其⽣产商为AuthenticAMD,就显⽰其为AMD公司;
否则,就显⽰⽆法识别;
vendor=`grep vendor_id /proc/cpuinfo |uniq |cut -d' ' -f2`
判断分数范围,分出优秀、良好、合格、不合格四档
85-100 优秀--A [ $score -ge 85 -a $score -le 100 ]
70-84 良好--B [ $score -ge 70 -a $score -lt 85 ]
60-69 合格--C [ $score -ge 60 -a $score -lt 70 ]
60分以下不合格--D else
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6、case多分⽀
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
case “var” in
pattern1) list1;;
pattern2) list2;;
...
*) listn;;
esac
⽰例1:根据⽤户输⼊,判断出该字符是字母、数字或者其他字符
read -p "please input a character: " num
case "$num" in
[a-zA-Z])
echo "$num is letter"
;;
[0-9])
echo "Snum is digit"
;;
*)
echo "Other!"
esac
⽰例2:将判断分数范围多分⽀语句⽤case语句实现
case语句编写服务启动脚本
系统⽰例脚本:
/etc/init.d/portmap
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7、循环
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7.1、while
当型循环
while condition
do
list
done
循环语句:
1、变量初始值
2、变量增加
3、避免死循环
⽰例1:批量创建⽤户
要求:
⽤户名以test开头,按数字序号变化;
⼀共添加30个账号,即test01,test02…,test30
⽤户初始密码为123456
思路:
i=1
while [ $i -le 30 ]
do
if [ $i -lt 10 ]
then
username=test0$i
else
username=test$i
fi
useradd $username
echo "123456" | passwd --stdin $i
let i++
done
⽰例2:猜商品价格
通过变量RANDOM获得随机数
提⽰⽤户猜测并记录次数,猜中后退出循环
price=`$[$RANDOM%1000]`
times=0
#/bin/bash
# define var
PRICE=$[$RANDOM % 100]
TIMES=0
while true
do
read -p "Please enter the product price [0-99] : " INT
let TIMES++
if [ $INT -eq $PRICE ]
then
echo "Good luck,you guessed it."
echo "You have guessed $TIMES times."
exit 0
elif [ $INT -gt $PRICE ]
then
echo "$INT is too high"
else
echo "$INT is too low"
fi
done
while true
do
list
done
⽰例3:while读取⽂件
⼯作过程中遇到要从⼀个ip列表中获取ip port,然后ssh ip 到⽬标机器进⾏特定的操作while读取⽂件⽅法:
⽅法1:⽂件描述法
exec < FILE
Sum=0
while read line
do
cmd
done
⽅法2:重定向法
cat $FILE | while read line
do
cmd
done
⽅法3:read釜底抽薪
while read line
do
cmd
done < FILE
while read line
do
IP=`echo $line | cut -d' '-f1`
PORT=`echo $line | cut -d' ' -f2`
echo "IP: $IP, PORT: $PORT"
done <ip.txt
另外逐⾏读取⽂件效率最⾼为for循环
for line in $(cat $FILE)
do
cmd
done
以上⽅法中for循环效率最⾼,read 釜底抽薪次之。

7.2、until
until condition
do
list
done
7.3、for
1)列表for循环
语法:
for var in list
do
commands
done
2)不带列表for循环
语法:
for var
do
statements
done
提⽰:不带列表的,相当于in “$@”。

3)C风格for循环
语法:
for ((exp1;exp2;exp3))
do
statements
done
⽰例1:直接列出变量列表所有元素
⽰例2:获取当前⽬录下的⽂件名作为变量列表打印输出
⽰例3:将之前⽤while语句创建的test01-test30⽤户删除
⽰例4:MySQL分库分表备份
⽰例5:不带列表for循环
循环控制结构:
break
循环结构 for/while 中使⽤,中⽌循环,若 break 后⾯指定⼀个数值 n 的话,则"从⾥向外"打断第 n 个循环,默认值为 break 1 ,也就是打断当前的循环。

continue
在循环结构 for/while 中使⽤,提前结束本轮循环,continue 后⾯也可指定⼀个数值 n ,以决定继续哪⼀层(从⾥向外计算)的循环,默认值为continue 1 ,也就是继续当前的循环
exit
exit命令⽤于退出当前shell,在shell脚本中可以终⽌当前脚本执⾏
退出码(exit status,或exit code)的约定:
0表⽰成功(Zero - Success)
⾮0表⽰失败(Non-Zero - Failure)
2表⽰⽤法不当(Incorrect Usage)
127表⽰命令没有找到(Command Not Found)
126表⽰不是可执⾏的(Not an executable)
>=128 信号产⽣
7.4、select
select语句结构:
select 变量 in 选项1 选项2
do
break
done
select 表达式是⼀种bash的扩展应⽤,动作包括:
⾃动⽤1,2,3,4列出菜单(没有echo指令,⾃动显⽰菜单)
⾃动read输⼊选择(没有 read指令,⾃动输⼊)
赋值给变量(没有赋值指令,⾃动输⼊数字后,赋值字符串给变量)
select本⾝就是⼀个循环,break是当选择后,就跳出循环
⽰例:
# vim 01.sh
#/bin/bash
echo "What is your favourite OS?"
select var in Linux Windows Mac other
do
break
done
echo "You have selected $var"
# sh 01.sh
What is your favourite OS?
1) Linux
2) Windows
3) Mac
4) other
#? 2
You have selected Windows
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8、函数
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
函数的作⽤就是把程序⾥多次调⽤的相同的代码,定义为⼀份,然后起个名字,所有的调⽤都只⽤这个名字即可。

修改代码时,只需要改变函数体内的代码即可。

优势
1、把相同的程序段定义为函数,可以减少程序代码量;
2、增加程序可读,易读性;
3、实现程序的功能模块化;
定义:
格式⼀:
function 函数名( )
{
指令…
}
格式⼆:
函数名()
{
指令…
}
格式三:
function 函数名
{
指令…
}
函数结束状态
执⾏函数时,函数中最后⼀个命令的传回值代表函数的结束状态。

也可以使⽤return⾃定义执⾏状态返回值,遇到return命令就⽴即结束,回到调⽤函数下⼀个命令,此时函数传回值0。

函数执⾏:
调⽤函数:
直接执⾏函数名即可。

函数名
带参数的函数执⾏⽅法:
函数名参数
⽰例1:
写⼀个脚本,判定192.168.0.200-192.168.0.254之间的主机哪些在线。

要求:
1、使⽤函数来实现⼀台主机的判定过程;
2、在主程序中来调⽤此函数判定指定范围内的所有主机的在线情况。

#直接使⽤函数实现(⽆参数,⽆返回值)
#使⽤函数传参(有参数,⽆返回值)
#使⽤函数返回值判断(有参数,有返回值)
⽰例2:写⼀个脚本:使⽤函数完成
1、函数能够接受⼀个参数,参数为⽤户名;
判断⼀个⽤户是否存在
如果存在,就返回此⽤户的shell和UID;并返回正常状态值;
如果不存在,就说此⽤户不存在;并返回错误状态值;
2、在主程序中调⽤函数;
shell函数与变量作⽤范围
变量作⽤范围
没有特别定义均为全局,局部变量使⽤local定义
移动位置参数shift n
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
9、数组
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
数组(也称Shell数组变量) ---⼀组数据的集合
普通数组:只能使⽤整数作为数组下标(数组索引)
关联数组:可以使⽤字符串作为数组下标(数组索引)
1、定义数组
数组名=(值1 值2 ... 值n)
⽰例:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个部分
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使⽤连续的下标,⽽且下标的范围没有限制。

2、数组操作
1)获取数组长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
2)引⽤数组
${数组名[下标]}
3)遍历数组
⽰例:
[root@localhost Scripts]# filename=(`ls`)
[root@localhost Scripts]# for var in ${filename[@]};do echo $var;done
或者
[root@localhost Scripts]# for var in ${filename[*]};do echo $var;done
或者
[root@localhost Scripts]# for ((i=0;i<${#filename[@]};i++));do echo ${filename[i]};done
4)数组的删除
unset array[1] # 删除数组中第⼀个元素
unset array # 删除整个数组
⽰例:
1、从“标准输⼊”读⼊n次字符串,每次输⼊的字符串保存在数组array⾥
i=0
n=5
while [ "$i" -lt $n ] ; do
echo "Please input strings ... `expr $i + 1`"
read array[$i]
b=${array[$i]}
echo "$b"
i=`expr $i + 1`
done
2、将字符串⾥的字母逐个放⼊数组,并输出到“标准输出”
chars='abcdefghijklmnopqrstuvwxyz'
for (( i=0; i<${#chars}; i++ )) ; do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
${chars:$i:1},表⽰从chars字符串的 $i 位置开始,获取 1 个字符
3、把1-3 3个数字存到数组⾥分别乘以8 然后依次输出。

#!/bin/bash
array1=(`seq 3`)
for ((i=0;i<${#array1[@]};i++))
do
echo $[${array1[$i]}*8]
done
------------------------------------------------------------------------------
10、正则表达式
------------------------------------------------------------------------------
1、什么是正则表达式?
简单的说,正则表达式就是⼀套处理⼤量的字符串⽽定义的规则和⽅法。

例如:假设 @代表12345
通过正则表达式这些特殊符号,我们可以快速过滤、替换需要的内容。

2、为什么要学习正则表达式?
在⼯作中,我们做linux运维⼯作,时刻⾯对着⼤量的⽇志,程序,命令的输出。

迫切的需要过滤我们需要的⼀部分内容,甚⾄是⼀个字符串。

3、两个注意事项:
1)正则表达式的应⽤⾮常⼴泛,存在于各种语⾔中,⽐如PERL,PHP,JAVA等我们主要学习linux的正则表达式,系统运维⼯作中常⽤的正则表达式
常⽤的正则表达式命令为grep(egerp),sed,awk。

linux三剑客,要想三剑客玩得更好,那就⼀定离不开正则表达式。

2)linux正则表达式和我们命令⾏中其他的命令使⽤的通配符是有本质区别的。

注意事项:
a、linux正则表达式⼀般是以⾏为单位处理。

b、alias grep='grep --color=auto',匹配到⾼亮显⽰
c、注意字符集,LC_ALL=C
4、linux正则表达式
10.1 、基于grep来讲。

基础正则表达式:BRE(basic regular expression)
1)^word 表⽰搜索以word开头的内容。

2)word$ 表⽰搜索以word结尾的内容。

3)^$ 表⽰空⾏,不是空格。

4). 代表且只能代表⼀个任意字符。

5)\ 转义字符,让有着特殊⾝份意义的字符。

例如:\.只表⽰⼩数点,还原原始的⼩数点的意义。

6)* 重复0个或多个前⾯的字符
7).* 匹配所有的字符。

^.* 任意多个字符开头。

8)[] 匹配字符集合内任意⼀个字符,如[a-z]
9)[^abc] ^在中括号⾥表⽰⾮,不包含a或b或c
10){n,m} 匹配n到m次,前⼀个字符。

{n,} ⾄少N次,多了不限。

{n} N次
{,m} ⾄多m次,少了不限。

注意:grep要{转义},\{\},egrep不需要转义
11)\<或\b:锚定词⾸(⽀持vi和grep),其后⾯的任意字符必须作为单词⾸部出现,如 \<love或\blove 12)\>或\b:锚定词尾(⽀持vi和grep),其前⾯的任意字符必须作为单词尾部出现,如 love\>或love\b
后项引⽤:后⾯例⼦中会⽤到。

分组:
\(\)
\(ab\)*
后项引⽤
\1:引⽤第⼀个左括号以及与之对应的右括号所包括的所有内容
\2:
\3:
扩展正则表达式:
+ 重复⼀个或者⼀个以上的前⼀个字符,如o+表⽰⼀个以上的o,。

+ 等价于 {1,}。

0个或者1个前⼀个字符,如o?表⽰空⽩或者1个o,? 等价于 {0,1}。

| 或,如要查找gd或者good这两个字符,egrep -n 'gd|good' grep.man,可以更多个字符串相或() 找组字符串,如查找glad或者good, egrep -n 'g(la|oo)d' grep.man
()+ 多个重复组的判别,如查找A开头C结尾,中间有⼀个以上的xyz,egrep -n 'A(xyz)+C' grep.man
grep命令:
-v:排除匹配的内容
-E:⽀持扩展的正则表达式
-i:忽略⼤⼩写
-o:只输出匹配的内容
--color=auto 匹配的内容显⽰颜⾊
-n 在⾏⾸显⽰⾏号
⽰例:
1、显⽰/proc/meminfo⽂件中以不区分⼤⼩的s开头的⾏;
grep -i '^s' /proc/meminfo
或 grep '^[sS]' /proc/meminfo
2、显⽰/etc/passwd中以nologin结尾的⾏;
grep 'nologin$' /etc/passwd
3、取出默认shell为/sbin/nologin的⽤户列表
grep '/sbin/nologin$' /etc/passwd | cut -d: -f1
4、取出默认shell为bash,且其⽤户ID号最⼩的⽤户的⽤户名
grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1
5、显⽰/etc/inittab中以#开头,且后⾯跟⼀个或多个空⽩字符,⽽后⼜跟了任意⾮空⽩字符的⾏;grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/inittab
6、显⽰/etc/inittab中包含了:⼀个数字:(即两个冒号中间⼀个数字)的⾏;
grep ':[0-9]:' /etc/inittab
或 grep -o ':[[:digit:]]:' /etc/inittab
7、显⽰/boot/grub/grub.conf⽂件中以⼀个或多个空⽩字符开头的⾏;
grep '^[:space:]\{1,\}' /boot/grub/grub.conf
8、显⽰/etc/inittab⽂件中以⼀个数字开头并以⼀个与开头数字相同的数字结尾的⾏;
grep '^\([0-9]\).*\1$' /etc/inittab
或 grep '^\([[:digit:]]\).*\1$' /etc/inittab
9、找出/proc/cpuinfo中的,1位数,或2位数;
grep '[0-9]\{1,2\}' /proc/cpuinfo
或 grep '[[:digit:]]\{1,2\}' /proc/cpuinfo
10、取出本机所有IP地址(不包括lo),并⽤如下格式打印
eno16777736: 192.168.95.120
eno33554984: 192.168.253.153
eno50332208: 10.20.0.128
⽅法⼀:
#!/bin/bash
Net_Name=(`ifconfig | grep -v "lo:" | egrep "^[[:alpha:]]{1,}" | cut -d' ' -f1`)
#Net_Name=(`ifconfig | awk '$1 !~ /lo/ && /^[[:alpha:]]{1,}/ {print $1}'`)
for var in ${Net_Name[@]}
do
echo -e "$var\t`ifconfig | grep -A 1 "$var" | grep "inet" |tr -s ' '|cut -d' ' -f3`"
#echo -e "$var\t`ifconfig | grep -A 1 "$var" | awk '/inet/ {print $2}'
done
⽅法⼆:
#!/bin/bash
Net_Name=(`ip a | egrep "^[0-9]{1,}" | grep -v "lo:"| cut -d' ' -f2`)
#Net_Name=(`ip a | awk '$2 !~ /lo/ && /^[0-9]{1,}/ {print $2}'`)
for var in ${Net_Name[@]}
do
echo -e "$var\t`ip a | grep -A 2 "$var" | grep "inet" | tr -s ' ' | cut -d' ' -f3 | cut -d/ -f1`" #echo -e "$var\t`ip a | grep -A 2 "$var" | awk '/inet/ {print $2}' | awk -F/ '{print $1}'' done
⽅法三:
Net_Name=(`ifconfig | awk -F: '$1 !~ /lo/ && /^[[:alpha:]]+/ {print $1}'`)
for var in ${Net_Name[@]}
do
echo -e "$var:\t`ifconfig $var | awk 'NR==2 {print $2}'`"
done。

相关文档
最新文档