文章目录
- gitee地址:linux基础
linux基础传送门:
grep正则表达式与shellscipt脚本编程
1.grep之正则表达式
grep命令含义是打印匹配给定模型的行,grep 搜索以 “FILE” 命名的文件输入 ,寻找含有与给定的模式 PATTERN 相匹配的内容的行。默认情况下, grep 将把含有匹配内容的行打印出来。
其命令格式如下:
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
或者是在之前介绍的命令后面接管道符"|"再接grep正则表达式。
其常用参数选项如下:
-
-n
:在输出的每行前面加上它所在的文件中它的行号 -
-v
:改变匹配的意义,只选择不匹配的行。 -
-E
:grep -E
==egrep,后接正则表达式。将模式 PATTERN 作为一个扩展的正则表达式来解释 -
-e
:只能传递一个参数
1.1 匹配符与重复操作符介绍
1.1.1 匹配符
-
\
:转义字符\+ \< \>
-
.
: 匹配任意单个字符 -
[1234abc],[^1234],[1-5],[a-d]
:字符序列单字符占位 ,所有数字和数字匹配自身[1-5]
匹配12345中的一个[^a-d]
:匹配不是abcd中的任意一个字符 -
^
:行首 ,^.k -
$
: 行尾 ,.k$ -
\<,\>
:单词首尾边界 ;\<abc
表示以abc开头的,abc\>
表示以abc结尾的,\<are\>
表示are单词 -
|
:连接操作符,并集 ;(<are>)| (<you>) 表示出现are或出现you都符合条件 -
,
: 选择操作符 ,即多种情况时,以逗号分开 -
\n
:反向引用
1.1.2 重复操作符
-
*
:匹配 0 到多次 -
?
: 匹配 0 到 1 次 -
+
:匹配 1 到多次 -
{n}
: 匹配 n 次 -
{n,}
:匹配n到多次 -
{m,n}
:匹配m到n次
除了*
是基本操作符外,其余全部是扩展操作符。grep命令默认工作于基本模式,使用grep -E
使工作于扩展模式。
注意:
基本正则表达式中元字符 :?,+,{,|,(和)丢失了特殊意义,需要加\,
反斜杠: \?,\+,\{,\|,\(以及\)
,扩展模式不需要加反斜杠
1.2 实例
下面以文件hello.txt
为例来展示grep的操作
hello world
are you ok?
areyou ok?
areyou are youok?
aaare you ok?
aare you ok
aaaare you ok
abcre you ok?
xxre you ok
are yyyou ok?
xk
zk
ok
yk
zzk
zxzxk
bxx
cxx
dxx
areyou are youok?
zk kz 1
kz zk 2
okk koo 3
zkkz
kzzk
-
匹配 are aare aaare,0 到多个 a 字符
[root@node1 ~]# grep "a*re" hello.txt
-
匹配“a 任意字符 re”
[root@node1 ~]# grep "a.re" hello.txt
-
匹配 a 一个到多个任意字符 re,此时,要使用扩展模式或者
\+
[root@node1 ~]# grep -E "a+re" hello.txt 或者 [root@node1 ~]# grep "a\+re" hello.txt
-
匹配包含 bcd 中任意一个字符的行
[root@node1 ~]# grep "[b-d]" hello.txt
-
基本正则模式,查找带问号的行,所以需要在基本模式下
[root@node1 ~]# grep "?" hello.txt
-
匹配“a 任意一个字符或二个字符 re”,
.
表示任意一个字符,依此类推[root@node1 ~]# grep "a.re" hello.txt [root@node1 ~]# grep "a..re" hello.txt
-
匹配 zk 和 xk
[root@node1 ~]# grep "[xz]k" hello.txt
-
匹配不是 zk 和 xk 的
[root@node1 ~]# grep "\<[^zx]k" hello.txt
-
匹配行首,该行第二个字符一定得是 k
[root@node1 ~]# grep "^.k" hello.txt
-
匹配行尾,该行最少两个字符,最后一个是 k
[root@node1 ~]# grep ".k$" hello.txt
-
匹配单词边界
[root@node1 ~]# grep "\<are\>" hello.txt
-
匹配单词开头
[root@node1 ~]# grep "\<are" hello.txt
-
匹配单词尾
[root@node1 ~]# grep "re\>" hello.txt
-
连接操作,取并集
[root@node1 ~]# grep -E "(\<a*re\>)|(\<you\>)" hello.txt
-
匹配该行中 3 个 a 重复的
[root@node1 ~]# grep -E "a{3}" hello.txt
2. Shell脚本编程
2.1 Shell脚本编程概述
比如,现在有5000台机器构成的集群,有一个课件,想向每台机器上都上传一份该课件,如何做?
答:写一个shell脚本,将5000台机器的ip地址写到列表里面,利用for循环,循环遍历ip地址,在循环内部将课件传输到每台机器上。
shell就是一个bash程序(进程),启动bash/python进程解释在脚本里编写的命令
- 解释器,启动器:
- 用户交互输入
- 文本文件输入
脚本本质:
#!/bin/bash
(大多数的脚本都是bash脚本)#!/usr/bin/python
读取(运行)脚本方式:bash/sh file
- 当前shell:
source file
- 新建子shell:
/bin/bash file
或者./file.sh
(需要chmod a+x file.sh
,给脚本添加执行权限,一般直接创建的文件是没有执行权限的,./file.sh
需要该文件的执行权限)
shell脚本的好处:命令行中的命令都可以放到一个文件中,省的每次都得重新写大量的shell命令。
补充:
-
echo $$
打印当前bash的PID[外链图片转存失败,源站可能