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 匹配 a 或 b 或 c

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

[a-zA-Z]  range匹配a到z或A到Z的任何单个字 符

[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,}  匹配X 至少n次

X{n,m}  匹配X 至少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,}+   匹配X 至少n次

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

分组,捕获及后向引用

元字符(Metacharacter)  匹配(Matches)

(...)  分组或捕获

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

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

(?:...)  分组

(?>...)  固化分组

多选结构

元字符(Metacharacter) 匹配 (Matches)

a|b|c 匹配 a 或 b 或 c

条件判断

元字符(Metacharacter)   匹配(Matches)


(?if then |else)


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

匹配模式


元字符(Metacharacter)  匹配(Matches)


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


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


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


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


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

时间: 2024-10-05 22:35:21

linux之正则表达式篇的相关文章

Linux Basics 正则表达式 grep

grep全称是:Global search Regular Expression and Printing全局搜索正则表达式并显示出来 使用正则表达式来描述选择条件. 取行选择:选取行的筛选条件,给定选取条件,只显示符合条件的行,或者只显示不符合条件的行. 对于类似的操作有三个命令:grep; egrep; fgrep grep:默认支持基本正则表达式: egrep:扩展正则表达式: fgrep:不支持正则表达式元字符,搜索字符串的速度快: 正则表达式是一类字符所书写的模式(pattern)  

linux之正则表达式

文件查找的需要: grep:(GLOBAL Research) 根据模式(网)去搜索文本,而后将符合模式的文本行显示出来. [部分匹配,显示时显示一行] Pattern:模式.(文本字符以及正则表达式元字符组合而成的匹配条件) 例子:grep  'root' /etc/passwd grep所支持的选项: -i:忽略大小写 --color 显示颜色 alias grep='grep --color' -v: 反向查找,显示没有被模式匹配的行 -o:只显示被模式匹配出来的字符串,每个字符串显示为一

Linux工具参考篇(网摘)

Linux工具参考篇 原文出处:[Linux Tools Quick Tutorial] 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. pstack 跟踪进程栈 6. strace 跟踪进程中的系统调用 7. ipcs 查询进程间通信状态 8. top linux下的任务管理器 9. free 查询可用内存 10. vmstat 监视内存使用情况 11. iostat 监视I/O子系统 12. sar 找出系统瓶颈的利器 13.

黑马程序员——正则表达式篇

------- android培训.java培训.期待与您交流! ---------- 正则表达式:符合一定规则的表达式. 作用:用于专门操作字符串. 特点:用一些特定的符合来表示一些代码操作,这样就简化书写. 所以学习正则表达式,就是在学习一些特殊符号的使用. 好处:可以简化对字符串的复杂操作. 弊端:符合定义越多,正则表达式越长,阅读性越差. 具体操作功能: 1,匹配:String matches(regex);用规则匹配整改字符串,只要有一处不符合规则,就匹配结束,返回false 2,切割

Linux shell 正则表达式用法

1.“ \  ” 用法 用于关闭其后续字符的特殊含义,恢复字符的本身含义,如:\\ 表示字符 \ 2. “ . " 用法 匹配任意单个字符 3. " * " 用法 匹配任意字符,可以是单个,也可以是多个,和 ”.“ 字符的去吧是是否可以匹配多个任意字符 4. "^" 的用法 在行的起始处开始匹配紧接着的字符,如 ^6,匹配行的首字符为6的行. 5." $ " 的用法 和 “^” 用法相似,表示在行的结尾处开始匹配字符,如 6$,匹配行的

linux中正则表达式的使用方法

大家好,欢迎你们来到我的博客,作为一个博客新手,这是我第一次发帖子,希望接下来的时间我们能够在linux的学习中互帮互助,共同进步! 好了,废话不多说,回归正题,今天我将要介绍的是非常强大的文本搜索工具--grep. grep的全称为:Globel Search Regular Expression and Printing out the line(全局搜索正则表达式并把行打印出来).它最重要的功能根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,然后将符合要求的字符串打印出来,但必须

linux学习---正则表达式与grep

正则表达式(Regular Expression(RE)) 是透过一些特殊字符的排列, 用以"搜寻/取代/删除"一列或多列文字字符串, 简单的说, 正则表达式就是用在字符串的处理上面的一项"表达式". 正则表达式并不是一个工具程序, 而是一个字符串处理的标准依据, 如果想要用用正则表达式处理字符串, 就要使用支持正则表达式的工具程序, 这样的程序有很多, 如vi, awk, grep, sed... grep 基本规则: grep [-acinv] [--color

linux初学者-ftp篇(一)

linux初学者-ftp篇(一) FTP是文件传输协议,是用于Internet上的控制文件的双向传输.用户可以通过客户机程序从远程主机上下载或者向远程主机上传文件. linux系统中,如果不了解SELINUX,需要将SELINUX下的enforing改为disabled,否则在进行上传或者下载时会有影响. 1.vsftpd服务的安装 在有yum源的前提下,输入"yum install vsftpd.x86_64 lftp.x86_64 -y"安装vsftpd服务,"vsftp

linux初学者-iscsi篇

linux初学者-iscsi篇 之前介绍过网络文件共享系统NFS和CIFS.在系统中,设备也是可以共享的,这就是iSCSI,它可以用来建立和管理IP存储设备.主机和客户机等之间的相互连接.下文将简要介绍这种网络设备共享系统.       1.安装 因为iSCSI是设备共享系统,所以在进行操作之间,需要先有一个硬盘设备.本文中是使用"fdisk /dev/vdb"来新建一个分区设备"/dev/vdb1"来作为共享设备. "yum install target