linux之正则表达式篇_正则

shell环境设定

shell也是一个应用程序,工作在用户模式,运行表现为一个进程,通过pstree可以查看到bash进程。

shell 进程用于通过命令行界面,类似windows的explore资源管理器。

bourn:开发shell ,bsh-->sh

BSD:研发csh

korn:研发ksh(商业版,功能强大)。

bash-->bourn again shell,Bash-->开源,bsh的增强版

shell本身是解释器,能够理解其他命令,并且让命令执行起来。理解语句,更具流程控制机制让语句按需要执行。

      读一句执行一句。

编译器:理解源程序,并且能够将源程序转换成二进制代码后执行。

      先将这个源程序转换成二进制格式再执行。

编译器:gcc

解释器:bash python、perl

在编写解释型程序的时候,由于需要解释器进行逐条解释,所有在程序的开头要写明解释器程序的位置。比如:”#!/bin/bash“

变量:内存空间的外在表现,是内存空间名称,用于存储数据。

变量类型:数据存储格式,数据表示范围:

 整型:

浮点型:

字符型:

布尔型:

字符:ascii,所有基本字符一共128个,至少需要7bits来表示所有的基本字符。

浮点:单精度,双精度

使用变量的步骤(c、java):

1、声明:给定一个变量类型。

2、声明的同时给其一个初始值,这个过程叫初始化。

3、赋值: int v=2

shell中的 变量

    属于弱类型语言:

           1、不强制区分变量类型,无论存储什么数据,均默认是字符格式存储。

           2、不需要事先声明。直接使用,直接赋值。

    定义变量

      [set]   var_name=value 有空格加“”

      

      引用变量:

       ${var_name} 通常‘{}’可以省略。{}通常用于对变量所定义数值的扩展

               比如: curname=gong 

                          echo “i am $curname”

                          echo  "she is ${curname}ziyan" 

     

      撤销变量:

       unset    var_name

bash变量类型:

     本地变量:只对当前shell进程有效,退出登录后无效。

     

     局部变量:对小范围代码段有效。其作用范围不包括当前shell的所有位置。

                    设置方法:local var_name=value

    环境变量:对当前shell及子shell有效(可以通过命令“bash”进入子shell)。

                    设置方法:export var_name=value

  

     位置变量:$1/$2.........

     特殊变量:$$、$!、$?.........

bash变量也可以声明,并指定类型:declare

      declare -i var_name:声明一个整型变量。

      declare -x var_name:声明一个环境变量。

      declare -a var_name:声明一个数组。

bash中如何查看环境变量:

printenv、export

查看所有变量:set

变量的引用:${var_name}

    变量替换:只能在双引号中实现。

   

bash的引号:

双引号:可以实现变量的替换。   

单引号:不替换,并且显示字符串本身。

    比较:name= 'good dog'

              echo  this is“$name”

              echo this is ‘$name’ 

反引号:命令引用,引用反引号命令的执行结果。

BingGongtekiMacBook-Pro:~ binggong$ echo "this is `date +%T`"

this is 14:36:47


$( )应用执行结果

BingGongtekiMacBook-Pro:~ binggong$ echo "nihao $(date)"

nihao 2016年10月20日 星期四 14时27分52秒 CST


bash 命令行快捷方式:

 ctrl+u:删除命令行首至当前光标所在位置的内容。

 ctrl+k:删除当前光标到行尾的内容。

 ctrl+a:跳至行首部

 ctrl+e:跳至行尾部

 ctrl+l:清屏,相当于clear

 ctrl+c:终止程序

 ctrl+z:将当前命令送至后台执行。

语言控制结构:

1、顺序执行

2、选择执行

3、循环执行

当alias的定义别名与元命令名相同的时候,使用元命令时可以在命令前加\来表示。


文件名通配符

?:用于匹配一个任意字符

*:用来匹配文件名中的任意字符串,匹配长度可以是0-n个

[]:匹配[]内的任意一个字符

                    -可以表示一个范围[a-z]

                     [acdf]表示任意一个字符

                     [!abdf]不匹配括号内adbf的任意字符

多条命令中的逻辑运算符合括号

command1 || command2:逻辑或运算,command1执行成功就不执行command2,否则会执行command2,两者选其一。

command1 && command2:逻辑与运行,command1执行成功才执行command2命令。

(command1;command2):优先执行()内部的命令,并按顺序执行

{command1;command2}:调用子shell命令并执行{}内部的命令,其实质是函数。

正则表达式:命令输出或者文本内容筛选查找。

使用位置:grep、awk、sed、vim

grep:支持基本的正则表达式,只针对文件进行查找工作

egrep:支持扩展正则表达式

tgrep:不支持正常表达式元字符,搜索字符串速度快。

正则表达式是一类字符所书写的模式。

元字符:不表示字符本身的意义,而用于额外功能的描述。通常元字符有两类,一类匹配具体的字符,一类匹配位置,比如行首行尾。

^:瞄定行首的符合条件的字符表达式。 grep --color=auto ^ssh /etc/passwd

$:锚定行尾的符合条件的内容,用法“name$”

     ^$:空白行

.:匹配任意单个字符。

*:匹配紧挨在其前面的字符任意次数。

[]:配置指定范围内的任意单个字符。

[^]:匹配任意指定范围外的单个字符。

[:lower:]:小写

[:upper:]:大写

[:digit:]:数字

[:space;]:空白字符

\?:匹配紧挨在其前面的字符0-1次。

x\{m,n\}:匹配其前面的字符至少m次,最多n次。

x\{0,n\}:至多n次

x\{m,\}:至少m次

x\{m\}:精确匹配只有m次。

\<:锚定词首,用于定位单词。也可以用\b 比如:\<word

\>:锚定词尾,用于定位单词,表示单词的结尾是指定的内容比如: \>word   

\<word\>:完全锚定某一个单词。

\(\):分组,将括号内的当成一个内容使用。当要求后面的内容和前面分组的内容相同时,可以使用\1来表示,1表示第几个分组。

用法:\(parttern\)      例如:grep '\(s.x\).*\1 /etc/passwd   

例如:grep '^s\{1,2\}.*' /etc/passwd

         grep “[bB].\{2,6\}[tT]”/etc/passwd

         grep "[^]" 

组合使用正则表达式

grep的选项:

--color=auto  通过修改全局(环境)变量来改变颜色:export GREP_COLOR='01;33'

-v:反向查找,只输出匹配内容以外的行。

-n:在结果输出的同时,输出行号

-i:不区分大小写。

-o:只显示匹配的字符串,而不是整个行。

-A n:显示匹配到的行时,顺带显示器前面的n行

-B n 后面的n行

-C n:前后的n行。

-E:表示扩展正则表达式,可以使用“|”或方式查找,但不支持与方式,所以需要管道重定向来分开查找

            grep -E 'gongbing|liuhaixiang' student.txt

-l:从多个文件中查找,只输出匹配内容的文件名称。

        grep -l "root" /etc/*

-h:从多个文件中查找,只输出匹配的内容,不显示文件名称。

        grep -h "root" /etc/*


练习:

显示/etc/rc.d/rc.sysinitd中以#开头,并且后面跟一个或多个空白字符,而后又跟了任意非空白字符。

grep '^#[[:space:]]\{1,\}[^[:space:]]' /etc/rc.d/rc.sysinit

1、显示/proc/cpuinfo中的processor开头并且后面跟了一个空字符的行,而后统计相关的行数

2、显示/var/log/secure文件中包含“failed password”或者“failed login”的行;而后统计相关的行数。

3、显示/var/log/secure文件中记录的属于当前系统时间的前一天的信息中包含“failed password”或者“failed login”的行,并统计行数

4、找出netstat -tan 命令执行的结果中以time_wait或者established结尾的行。

显示某文件中的一位数和两位数。

grep  ‘\<[:digit:]\{1,2\}\>’/etc/passwd

基本正则表达式:

.   \?    *     \<    $     ^      []    \{n,m\} 等。

扩展正则表达式:

.:任意单个字符

[]:指定范围内的单个字符

[^]:取反

*:任意多个

+:匹配其前面的字符至少1次。

?:0或1次

{n,m}:至少m次,至多n次。

():分组,与基本正则表达式不同的是不需要\

a|b:二选其一。

sort:

-f:忽略大小写

-n:以数字大小写排序(默认是以字符方式排序)

-u:排序过程中删除结果相同的行。

-r:降序排列

-R:随机排序。

uniq:选取唯一值。

  -c:统计每行重复的次数。

  -u:显示没有重复的行

  -d:只显示重复过的行

   -t:指定分隔符

   -k:指定字段

练习:

        查找/etc/passwd文件中使用bash的uid最小的用户名

                 grep 'bash' /etc/passwd |sort -n -t : -k 3 |head -n 1 |cut -d : -f 1

有变量、转义字符的时候需要使用双引号。

bash的配置文件:

profile类:交互式登陆的用户

                  /etc/profile (全局,对所有用户有效)

                  /etc/profile.d/*.sh:全局,对所有用户有效,是对profile的补充。

                  ~/.bash_profile:仅对某用户自己有效。

                                  功能:设置环境变量、运行命令和脚本

basher类:非交互式登陆的用户

                  /etc/bashrc:全局有效

                 ~/.bashrc:仅对用户自己有效。

                          功能:设置本地变量、定义用户别名

假定新安装jdk文件,可执行命令为/usr/java/latest,需要指定环境变量(全局)JAVA_HOME。如何操作。

vi /etc/profile,也可在/etc/profile.d/新建一个配置文件(java.sh),来进行配置。

添加: export JAVA_HOME=/etc/java/latest

. /etc/profile.d/java.sh  配置生效

echo $JAVA_HOME    查看

在配置文件更新后,新的定义不会立即生效,要想立即生效有两种方式:

1、重启

2、source file

交互式模式就是shell等待你的输入, 并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式,shell script(非交互)方式执行。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了


交互式登陆环境:

1、直接从终端登陆的用户

2、su - username


非交互登陆:

1、su username

2、在图形模式下,打开的一个伪终端。

3、执行脚本


读取bash的顺序:

交互式登陆:

      /etc/profile-->/etc/profile.d/*.sh-->~/.bash.profile-->~/.bashrc-->/etc/bashrc 最后执行的优先级高

非交互式登陆:

      ~/.bshrc-->/etc/bashrc-->/etc/profile.d/*.d

I/O重定向,管道

file disciptor,文件描绘符,FD

标准输入fd:0

标准输出fd:1

错误输出fd:2

将默认数据流改为其他设备,就称为io重定向。

>:覆盖重定向

>>:追加重定向

2>:错误覆盖重定向

2>>:错误追加重定向

ls /usr >/tmp/1 2>/tmp/2 同时对正确和错误的输出进行操作。

&>标准输出和错误输出合并重定向到一个文件

&>>标准输出和错误输出合并追加到一个文件。

输入重定向:

<:输入重定向

<<:此处创建文件。通常用于脚本中文档的生成

cat >/tmp/123 <<eof(eof可任意写)

管道的最后一个命令是在当前shell的子shell中执行的,所有不要用变量获取结果。

t命令可以将重定向和管道结合起来使用,就是在将前一个命令的结果输出到屏幕的同时还可以保存到文件,也就是说可以管道到下一个命令中。

SED 非交互式文本编辑器

命令本身并不会更改源文件内容,如果要将修改结果保存下载,请使用输出重定向

sed逐条读取文件并放到模式空间里,通过编辑命令进行执行并将结果保持到保留空间中。

命令格式:

sed [选项] 命令 文本文件名

选项:

-n:不打印全部内容,默认情况是对文本全部内容输出信息。

-e:连接多条编辑命令

-f:指定脚本文件

编辑命令:

p:打印匹配行

=:显示指定的行号

a\:在定位行号后添加新文本信息,\表示换行

i\:在定位行前添加文本信息

c\:用新文本替换定位位置文本内容

d:删除定位行

s:使用替换模式

r:从另一个文件中读文本并替换

一、查找指定范围

1、x:具体行号

        sed -n '2p' /etc/passwd

2、x,y:指定行范围,1,7

        sed -n '1,10p' /etc/passwd

3、/pattern/:查找包含模式的行,/disk/

        sed -n '/nobody/p' /etc/passwd

4、x,/pattern/:从第n行开始到匹配项之间的所有内容

        sed -n '/nobody/,$p' passwd

5、/pattern/,y:从匹配内容开始向下到第n行。

        sed -n '1,/nobody/p' passwd

6、x,y!:排除指定的范围

        sed -n '1,30!p' passwd

7、1,$:显示所有行

8、$:打印最后一行

         sed -n '$p' passwd

二、打印行号

1、查找passwd文件中的包含gong用户的所在行号

sed '/gong/=' passwd

三、插入、替换指定内容

1、在passwd文件,包含root的行后插入###############。

sed '/root/'a\ "###########" passwd

2、在passwd文件,包含root的行前插入###############。

sed '/root/'a\ "###########" passwd

3、在passwd文件,包含root的行替换为###############。

sed '/root/'c\ "############" passwd

4、在passwd文件,删除###############。

sed "/####/"d passwd

四、替换文本

s/paterntofind/newpartern/[gpwn]

同i\a\的区别主要是:

i、a替换的是整行,而s替换的查找到的具体内容。

选项

g:全局查找替换所有符合的模式

1、替换passwd文件中的gongbing 为liuhaixing

sed    's/gongbing/liuhaixiang/g' passwd

2、删除passwd文件中的root

sed 's/root//g' passwd

&:表示对前一个模式所指的内容进行重新引用

比如: sed 's/gongbing/bingle &/g' passwd 表示在gongbing的前面添加一个bingle字符串。

显示文本文件的控制字符

1、cat -v passwd

2、sed '1.$l' passwd       l:小写l表示显示控制符

五、删除行

d:用来删除匹配的行。

sed ‘/^28/d’ /etc/passwd

删除文件中以28开头的行。

sed -ne ‘/[Ll]ixia/d’-e '/shanghai/d' -e p students

多匹配内容之间的删除操作需要-e的配合。

元字符终极总结

字符(Characters)

字符组(Character classes)

元字符(Metacharacter)  匹配(Matches)

[abc]  simple class 匹配 或 或 c

[^abc]  negation 匹配 abc 之外的任何单个字符

[a-zA-Z]  range匹配azAZ的任何单个字 符

[a-d[m-p]]  union 等同于[a-dm-p]

[a-z&&[def]]  intersection 匹配 d, e 或 f

[a-z&&[^bc]]  subtraction 等同于[ad-z]

预定义字符组(Predefined character classes)

元字符(Metacharacter)  匹配(Matches)

. dot 任何字符,能不能匹配换行符取决于匹配 模式

\d  digit 数字,等价于[0-9]

\D  non-digit 非数字,等价于[^0-9]

\s  whitespace 空白字符,等价于[ \t\n\x0B\f\r]

\S  non-whitespace 非空白字符,等价于[^\s]

\w  word 组成单词的字符,等价于[a-zA-Z_0-9]

\W  non-word 不是组成单词的字符,等价于[^\w]

POSIX 字符组

元字符(Metacharacter)  匹配(Matches)

[:lower:]: 小写

[:upper:]: 大写

[:digit:]: 数字

[:space;]: 空白字符

零长度断言

元字符(Metacharacter)  匹配(Matches)

^ caret  行首

dollar 行尾

\b boundary 单词边界

\B  非单词边界

\<  单词的起始位置

\>  单词的结束位置

\A   字符串起始位置

\Z  字符串结束位置

\z  字符串结束位置

\G 次匹配的起始位置或上次匹配的结束 位置

(?=...)  positive lookahead 如果右边能够匹配,则成功

(?!...)  negative lookahead 如果右边不能够匹配,则成功

(?<=...)  positive lookbehind 如果左边能够匹配,则成功

(?<!...)  negative lookbehind 如果左边不能够匹配,则成功

贪婪量词

元字符(Metacharacter)  匹配(Matches)

X?  匹配 X 0次或1

X*  匹配 X 0次或无数次

X+  匹配 X 1次或无数次

X{n}  匹配 X n 

X{n,}  匹配至少n

X{n,m}  匹配至少n次至多m

非贪婪量词

元字符(Metacharacter)  匹配(Matches)

X??  匹配X0次或1次

X*?  匹配X0次或无数次

X+?  匹配X1次或无数次

X{n}? 匹配Xn次

 X{n,}?  匹配X至少N次

X{n,m}? 匹配X只是N次至多M次

占有量词

元字符(Metacharacter)  匹配(Matches)

X?+  匹配 X 0次或1

X*+   匹配 X 0次或无数次

X++   匹配 X 1次或无数次

X{n}+   匹配 X n 

X{n,}+   匹配至少n

X{n,m}+   匹配至少n次至多m

分组,捕获及后向引用

元字符(Metacharacter)  匹配(Matches)

(...)  分组或捕获

\n  引用第 个括号中匹配的内容

(?<name>...)  命名捕获

(?:...)  分组

(?>... 固化分组

多选结构

元字符(Metacharacter) 匹配 (Matches)

a|b|c 匹配 或 或 c

条件判断

元字符(Metacharacter)   匹配(Matches)

(?if then |else)

条件为真,则匹配 then 子表达式,否则匹配 else 子表达式

匹配模式

元字符(Metacharacter)  匹配(Matches)

(?i:...)  不区分大小写的匹配模式

(?x:...)  注释模式

(?s:...)  单行模式(点号通配模式)

(?m:...)  多行模式(增强的行锚点模式)

\Q...\E  文字文 模式