一.简介

shell中正则表达式用于对文本的处理,如匹配、查找和替换,通常会结合grep、sed和awk一起使用。

二.正则表达式的模式

普通字符:直接匹配它们自身,如字母、数字、空格等
特殊字符:具有特殊的含义和功能,如. .*  +  ? |等
字符类:用于匹配方括号内的任意一个字符,用方括号 [ ] 包围的字符集
元字符:用于匹配特定类型的字符,如数字、字母、空白字符等,如 \d、\D、\w、\W、\s、\S 等
量词:用于指定匹配的次数或范围,如 {n}、{n,}、{n,m} 等
边界符号:用于匹配字符串的开头、结尾或单词边界位置,如 ^、$、\b、\B 等
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

用法简介:

普通字符

字符

字面意思

如匹配abc    egrep "abc"

特殊字符

.

任意一个字符

如匹配a后面的任一字符      grep 'a.'

*

*前的字符 有0个或多个

如匹配至少0或多个字母a     grep 'a*'

.*

匹配所有 贪婪匹配

如匹配a到8之间所有字符      grep 'a.*8'

+

+前的字符 有1个或多个

如匹配至少一个或多个字母a     egrep 'a+'

?

?前的字符 有0个或1个

如匹配0个或一个字母a     egrep 'a?'

|

或|前后的字符

如匹配a或者b                egrep 'a|b'

\

转义字符


字符类

[]

[]括号内的任一字符

如匹配a或b或c    egrep '[abc]'

[^ ]

[]括号内的以外字符

如匹配a或b或c以外的字符    egrep '[^abc]'

()

()括号内整体

如匹配123整体组和的字符     egrep '(123)'

[[:space:]]

匹配空格(空格/制表/换行)


[[:blank:]]

匹配空白字符(空格/制表)


元字符

\d

匹配数字

如匹配数字      等同于egrep '[0-9]'

\D

匹配非数字

如匹配非数字   等同于egrep '^[0-9]'

\w

匹配一个单词字符(字母/数字/下划线)

等同于[a-Z0-9_]

\W

匹配一个非单词字符

等同于[^a-Z0-9_]

\s

匹配一个空白字符(空格/制表/换行)


\S

匹配一个非空白字符


量词

{n}

匹配前面的字符n次


{n,}

匹配前面的字符至少n次


{n-m}

匹配前面的字符最少n次,最多m次


边界字符

^

匹配字符串的开头

如去掉以#开头的   grep -v   ^# 

$

匹配字符串的结尾

如去掉以a结尾的   grep -v   a$

^$

匹配空行


\b

单词的边界


\B

非单词边界


修饰符

i

ignore 不区分大小写

如不区分大小写匹配字母a    grep -i  a

g

global 全局匹配


s

.中包含换行\n


m

multi line多行匹配


二.shell

1.逻辑运算与算数运算

-eq

等于

如果$n等于1    [ $n -eq 1 ]

-ne

不等于   !=

如果$n不等于1 [ $n -ne 1 ]

-lt

小于

如果$n小于1    [ $n -lt 1 ]

-gt

大于

如果$n大于1    [ $n -gt 1 ]

==

恒等于   =为赋值

如果$n恒等于1 [ $n == 1 ]

&&

&&前后的命令,前面执行成功,才执行后面的

||

||    前后的命令,前后的未执行成功,才执行后面的

+


-


*


/

保留2位小数点  scale=2      echo "scale=2;100/9" | bc

%

取余

echo "9%5" | bc  结果为4

2.字符串与文件运算

-n

不为0

[ -n $a ] 

-z

为0

[ -z $a ] 

-f 

文件存在

[ -f /tmp/text ]

-d 

目录存在

[ -d /tmp/mysql ]

-e

文件目录存在

[ -e /tmp/mysql ]

2.变量与引用

变量赋值

var=value

局部变量,次脚本内部有效


export var=value

全局变量,所有程序或脚本可用


引号类型

' '

单引号 所见即所得 原封不动


""

双引号 变量允许引入,其他不变


` `

反单引号 执行引号内的命令,推荐使用$()


3.$的几种用法

1-n

shell的第几个参数


$1-$n

添加到shell各参数的值


$0

shell脚本的文件名


$#

参数的个数


$?

命令执行的状态,0正确,非0出错


$$

脚本运行的当前进程ID


$!

shell最后运行的 后台进程PID


$*

所有参数列,加“”后,所有参数为一个整体


$@

所有参数列,加“”后,所有参数独立,常用这种


$-

shell使用的当前选项


${#n}

第n个参数的长度

如第一个参数的长度不等于8  [  ${#1} -ne 8 ]

4.常用条件控制语句与函数

选择结构

if-else

if [ 判断条件 ] 
  then 
     do 
      命令
     done
   else 
      命令
fi
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

 case 多选择和场景

case 变量值 in
    值1)
       命令
       ;;
    值2)
       命令
       ;;
      *)
       命令
        ;;
esac
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

循环结构

for循环

for var in item1 item2 ... itemn
do
  命令
done
  • 1.
  • 2.
  • 3.
  • 4.

while 循环

while ture
 do
   命令
   continue  #跳出本次循环,进入下次循环
   break     #结束,退出循环
 done
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

函数

函数名()
{
  函数实现的功能代码
}

#函数调用
直接写函数名
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

5.传参和用户交互read -p

#提示用户输入1个变量
read -p "Enter value1 :" value1
#提示用户输入2个变量
read -p "Enter value1 and value2 :" value1 value2

#引用变量
$1 参数1 $2 参数2
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

三.四剑客

grep常用

grep -i 忽略大小写
grep -v 取反
grep -E 扩展 == egrep
grep -RF "example" /opt  查/opt目录下包含example的文本
  • 1.
  • 2.
  • 3.
  • 4.

sed常用

#替换
sed -i 's/A/B/g'    s替换  g全局  -i 立即写入
sed -i 's/A//g'     A替换为空
#添加
sed -i '/#Port/a Port 2222'   a添加,在#Port下面添加Port 2222
sed -i '/#Port/i Port 2222'   i插入,在#Port上面插入添加Port 2222
sed -i '2a\Port 2222'         2a 在第二行下面添加Port 2222
sed -i '2i\Port 2222'         2i 在第二行上面插入Port 2222
#删除
sed -i  '/#Port/d'            d删除  删除#Port的行
sed -i  '1d'                  1d     删除第一行
sed -i  '/^$/d'               删除空行
#查看
sed -n "2p"                   2p打印第二行  -n 处理后输出
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

awk常用

awk -F ":"     -F指定分割符 分隔符为:
awk -v ‘'j=$i'    -v变量赋值,将shell脚本中变量赋值到awk中的变量j
awk -F ":" '{print $0}'  $0打印所有内容
awk -F ":" '{print $1}'  $1打印第一列内容
awk -F ":" '{print $NF}' $NF打印最后一列内容
awk -F ":" '{print NR}'  NR打印行号,从1开始
awk -F ":" '{print NF}'  NF打印行中有几个字段
awk -F ":"  '$2 ~ "123" {print $1}'    ~ 精确匹配,第二列匹配到123的行第一列打印出来
awk -F ":"  '$2 == "123" {print $1}'   ==精确匹配,第二列匹配到123的行第一列打印出来
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

cut常用

cut -d ":"   -d 指定分隔符 为:
cut -d ":" -f 1   -f 1 按字段提取第1列
  • 1.
  • 2.