【金沙官网线上】Linux文本处理命令

正则表达式&&文本处理利器

学习目标:

l  掌握正则表达式的运用

l  掌握sed、awk文本处理工具的使用

目录结构:

 金沙官网线上 1

 

 

Linux文本处理命令

正则表达式

正则表达式

POSIX标准将正则表达式分为两类
1.基本的正则表达式
2.扩展的正则表达式
大部分Linux应用和工具仅支持基本的正则表达式

正则表达式概述

l  正则表达式:使用单个字符串来描述,匹配一系列符合某个句法规则的字符串

l  由普通字符与特殊字符组成

l  一般用在脚本编程,文本编辑器中,如php、Python、shell等,简写为regex、regexp、RE

l  用来检索、替换符合模式的文本,具有强大的文本匹配功能

l  能够在文本海洋中快速高效地处理文本

l  正则表达式层次

基础正则表达式

拓展正则表达式

l  Linux中文本处理工具

grep

sed

awk

基本正则表达式

符号 意义
* 0个或多个字符
. 匹配任意字符
^ 行首,在[]中表示非
$ 行尾
[] 匹配字符集合
转义字符
<> 精确匹配符号
{n} 匹配n次
{n,} 匹配至少n次
{m,n} 匹配m~n次

正则表达式元字符

l  基础正则表达式是常用的正则表达式部分

l  除了普通字符外,常见到以下元字符

:转义字符,使符号就是符号,不存在其他含义。!,n等

^:匹配字符串开始的位置

       例:^a, ^the, ^#

$:匹配字符串结束的位置

       例:word$

.:匹配除n之外的任意的一个字符

       例:go.d , g..d

*:匹配前面子表达式0次或者多次

       例:goo*d,go*d

[list]:匹配list列表中的一个字符

       例:go[ola]d , [abc], [a-z], [a-z0-9]

[^list]:匹配任意不在list列表中的一个字符

       例:[^a-z], [^0-9], [^A-Z0-9]

{n,m}:匹配前面的子表达式n到m次,有{n}, {n,}, {n,m}三种格式

       例:go{2}d, go{2,3}d, go{2,}

扩展正则表达式

符号 意义
? 匹配0个或1个
+ 匹配1个或多个
() 表示一个字符集合或用在expr中
| 表示或

扩展正则表达式元字符

l  扩展正则表达式是对基础正则表达式的扩充深化

l  扩展元字符

+:匹配前面子表达式1次以上

       例:go+d, 将匹配至少一个o

?:匹配前面子表达式0次或者1次

       例:go?d, 将匹配gd或者god

():将括号中的字符串作为一个整体

       例:(xyz)+, 将匹配xyz整体1次以上,如xyzxyz

|:以或的方式匹配字条串

       例1:good|food,将匹配good或者food

       例2:g(oo|la)d,将匹配good或者glad

 

通配符

bash Shell本身不支持正则表达式,使用正则表达式的是shell命令和工具,如grep,AWK,sed等。但是bash Shell可以使用正则表达式中的一些元字符实现通配。

符号 意义 示例 解释
* 任意字符 Phi*ip.rtf 以Phi开头,以ip.rtf结尾的文件
? 一个任意字符 ls -l 0?.pem 列出0开头且文件为两个字符的pem文件
[] 表示范围 ls -l [a-h].awk 列出以a-h开头的awk文件
{} 一组表达式的组合 ls -l {[a-h]*.awk,0?.pem} 匹配[a-h]*.awk或0?.pem的文件
^ 取反 ls -l [a-h]*.[^awk]* 以a-h开头,且不是awk类型的文件

Sed工具实践

Grep

全面搜索正则表达式并把行打印出来(Global search Regular Expression and Print out the line)
grep [选项][模式][文件…]

sed工具概述

l  sed是文本处理工具,读取文本内容,根据指定的条件进行处理,如删除,替换,添加等

l  可在无交互的情况下实现相当复杂的文本处理操作

l  被广泛应用于shell脚本,以完成自动化处理任务

l  Sed依赖于正则表达式

选项

选项 意义 整词
-c 只输出匹配行的数量 count
-i 搜索时忽略大小写 ignore
-h 查询多文件时不显示文件名  
-l 只列出符合匹配的文件名,而不列出具体的匹配行 list
-n 列出所有的匹配行,并显示行号 number
-s 不显示不存在或无匹配文本的错误信息  
-v 显示不包含匹配文本的所有行 reverse
-w 匹配整词 word
-x 匹配整行  
-r 递归搜索,不仅搜索当前工作目录,而且搜索子目录 recursion
-q 禁止输出任何结果,以退出状态表示搜索是否成功 quit
-b 打印匹配行距文件头部的偏移量,以字节为单位 byte
-o 与-b选项结合使用,打印匹配的词距文件头部的偏移量,以字节为单位  
-E 支持扩展的正则表达式 Extract
-F 不支持正则表达式,按照字符串的字面意思进行匹配  

Sed用法举例

l  替换举例

sed ‘s/xml/XML/’ bfile  //将每行中的第一个xml替换为XML

sed ‘s/xml//g’ bfile  //将文件中所有xml删除

sed ‘3,5s/xml/XML/g’ bfile  //将第3-5行中的所有xml都替换为XML

sed ‘/xml/s/com/COM/g’ bfile  //将包含xml的所有行中的com都替换为COM

l  多次执行编辑命令

sed -e ‘3,5p’ -e ‘3,5s/xml/XML/g’ bfile  //可将多个编辑命令保存到文件中,通过-f指定文件,以完成多个处理操作

 

这只是sed和正则表达式的结合使用的部分案例

有关sed的具体使用详见https://www.cnblogs.com/zwgblog/p/6013975.html

模式

字符串、变量、正则表达式

注意:只要模式中包含空格,就需要使用双引号将模式引进来

awk工具实践

实例

-w和-x选项
grep命令模式支持正则表达式,正则表达式的元字符被解释成特殊含义;
-w选项表示匹配整词,即以模式的字面含义去解释
如:
grep cer* *.pem
grep -w cer* *.pem
-x 是匹配整行
-w 使用不方便,最好和 -F 一起使用

awk工具介绍

l  awk也是一个功能强大的编辑工具,与sed一样,可在无交互的情况下实现相当复杂的文本操作

l  命令格式

awk 选项 ‘模式或条件{编辑指令}’ 文件1 文件2

awk -f 脚本文件 文件1 文件2

l  工作原理

逐行读取文本,默认以空格为分隔符进行分割,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令

l  awk 内置变量

FS:指定每行文本的分隔符,缺省为空格或制表位

NF:当前处理的行的字段个数

NR:当前处理的行的行号(序数)

$0:当前处理的行的整行内容

$n:当前处理行的第n个字段(第n列)

grep命令族

grep
标准grep命令,支持基本正则表达式 egrep
扩展grep命令,支持基本和扩展正则表达式
等价于grep -E fgrep
快速grep命令,不支持正则表达式,按照字面意思进行匹配
等价于grep -F

awk工具举例

l  打印文本内容

awk ‘NR==1,NR==3{print}’ bfile  //输出第一至第三行内容

awk ‘NR==1|NR==3{print}’ bfile  //输出第一行,第三行内容

awk ‘/^root/{print}’ /etc/passwd  //输出以root开头的行

 

l  按字段输出文本

awk ‘{print $1,$3}’ bfile  //输出每行中的第1,第3个字段

awk -F “:” ‘{print$1,$7}’ /etc/shadow  //输出密码为空的用户的shadow记录

 

同理awk的具体介绍详见http://blog.chinaunix.net/uid-23302288-id-3785105.html

 

至此shell编程的基本知识都已经了解完毕了,详见博主主页 http://www.cnblogs.com/tzlsj。shell编程博大精深,擅长处理各种文件,与Linux的一切皆文件的特点十分契合。

现在了解的shell知识点犹如四则运算法则,看似很简单,实则各种组合变化。接下来我会给大家找一些好玩的小脚本,进行shell的实际运用和巩固强化。

sed

sed,stream editor,流编辑器,将一系列编辑命令作用于一批文本文件
适用场合:

编辑相对交互式编辑器而言太大的文件 编辑命令太复杂,在交互式文本编辑器中难以输入的情况 对文件扫描一遍,但是需要执行多个编辑函数的情况

三种调用方式

sed [选项] ‘sed命令’ 输入文件 sed [选项] -f sed脚本 输入文件 ./sed脚本文件 输入文件

选项

选项 意义
-n 不打印所有行到标准输出
-f 表示正在调用sed脚本文件
-e 表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,可以省略-e

sed命令

通常由定位文本行和sed编辑命令两部分组成,sed编辑命令对定位文本行进行各种处理

sed定位文本行

选项 意义
x x为指定行
x,y 指定行范围
/pattern/ 包含模式的行
/pattern/pattern/ 包含两个模式的行
/pattern/,x 从与pattern的匹配行到x之间的行
x,/pattern/ 从x开始到pattern的匹配行
x,y! 不包括x和y的行

sed编辑命令

sed编辑命令标示对文本进行何种处理,如打印,删除,追加,插入,替换等

选项 意义
p 打印匹配行
= 打印文件行号
d 删除定位行
a 在定位行号之后追加文本
i 在定位行号之前插入文本
c 用新文本替换定位文本行
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 将文本写入另一个文本
y 变换字符
q 第一个模式匹配完成后退出
l 显示与八进制ASCII码等价的控制字符
{} 在定位行执行的命令组
n 读取下一个输入行,用下一个命令处理新的行
h 将模式缓冲区的文本复制到保持缓冲区
H 将模式缓冲区的文本追加到保持缓冲区
x 交换模式缓冲区和保持缓冲区
g 将保持缓冲区文本复制到模式缓冲区
G 将保持缓冲区文本追加到模式缓冲区

实例

sed -n ‘1p’ file sed -e ‘/^f*/p’ -e ‘/^f*/=’ file 定位命令
匹配元字符
sed -n ‘/./p’ input
sed -n ‘/$/p’ input 使用元字符进行匹配
sed -n ‘p′input(注意:在sed命令中表示最后一行)
sed -n ‘/^$/p’ input (匹配空行)
sed -n ‘/.*bus/p’ input !符号
sed -n ‘2,10!p’ input 使用行号与关键字匹配限定行范围
sed -n ‘/seugrid/,$p’ input
sed -n ‘3,/seugrid/p’ input

编辑命令

插入文本
sed ‘指定地址itext’ input (在指定位置之前插入)
sed ‘指定地址atext’ input (在指定位置之后插入)
sed ‘/i/iinputnsecond’ (插入两行input和second)
sed ‘/i/ainputnsecond’ 修改文本
sed ‘指定地址ctext’ input (将整个匹配行修改为新文本行)
sed ‘/Certificate/cNew line:’ input 删除文本
sed ‘指定位置d’ input (删除指定行) 替换文本
sed ‘s/被替换字符串/新字符串/[替换选项]’
sed ‘s/被替换字符串/新字符串/number[替换选项]’(表示第number(1~512)次匹配)

选项 意义
g 全部替换
p 与-n选项结合,只打印替换行
w 文件名 表示将输出定向到一个文件

写入新文件
sed ‘指定地址w file’ input
sed ‘1,5w file’ input
sed ‘/Certificate/w file’ input 从文件读入文本
sed ‘指定地址r file’ input 退出命令
sed ‘指定地址q’ input 变换命令
sed ‘y/被替换字符序列/变换的字符序列/’ 输入文件
两个序列长度必须一样
sed ‘y/fmg/FMG/’ input 显示控制字符
显示退格符,F1键,shift键等
sed -n l input
sed -n ‘指定位置l’ input 在定位行执行命令组
sed -n -e ‘/Certificate/p’ -e ‘/Certificate/=’ input
sed -n ‘/Certificate/{p;=}’ input 高级编辑命令
处理匹配行的下一行
sed ‘/Certificate/{n;s/11/99/;}’ input sed缓冲区的处理
sed ‘/Subject/h;/seugrid/x;$G’ input
1.匹配Subject,并将匹配行写入保持缓冲区
2.匹配seugrid,将保持缓冲区和模式缓冲区交换
3.到结尾行,将保持缓冲区追加到模式缓冲区 利用分号分隔多个编辑命令
上例已经使用了这种表示

AWK

awk的基本语法与C语言类似,与sed的功能类似,用来处理文本,awk可以从文件或字符串中基于指定规则浏览和抽取信息,在抽取信息的基础上,才能进行其他文本操作
最新的awk是gawk,可以实现数据查找,抽取文件中数据,创建管道流命令

AWK编程模型

awk程序由一个主输入循环维持,主输入循环自动依次读取文件行,用程序员定义的处理文件行的动作处理,循环执行直到终止条件。
与C,C++,Java的不同是,程序员不需要关注打开文件,读取文件行,关闭文件的动作,而只关注处理行的执行动作。

金沙官网线上 2

AWK调用

Shell中调用
awk [-F 域分隔符] ‘awk程序段’ 输入文件 将awk程序段插入脚本文件
awk -f awk脚本文件 输入文件 将脚本文件设置为可执行
./awk脚本文件 输入文件

AWK编程

AWK模式匹配

awk由模式和动作组成。模式是一组用于测试输入行是否需要执行语句,动作则是包含语句,函数和表达式的执行过程。即模式决定动作何时触发事件,动作执行对输入行处理
如:awk ‘/^$/{print “this is a blank line.”}’ input

记录和域

awk认为文件是有结构的,每一行为一个记录,记录由域组成,域之间使用空格,Tab或其他符号进行分隔。
域操作符$:指定执行动作的域,$1…标识每一个域,$0表示整个记录;也可以跟变量或变量表达式
如:awk ‘BEGIN{one=1;two=2} {print $(one+two)}’ input
默认是空格,Tab键被认为是多个空格(也多个空格被当成一个空格)
1.可以使用-F 来改变默认的分隔符
2.可以使用环境变量FS设置分隔符
实例:
1.FS=”t”
2.FS=”t+”
记录:wazttcq
对于FS=”t” 分成三个域,waz,空域,cq;对于FS=”t+”,结果是waz,cq

本文由金沙官网线上发布于操作系统,转载请注明出处:【金沙官网线上】Linux文本处理命令

您可能还会对下面的文章感兴趣: