博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式、sed、awk
阅读量:4106 次
发布时间:2019-05-25

本文共 2855 字,大约阅读时间需要 9 分钟。

 

awk:通配符.*

 

1.正则表达式

首先,必须知道命令是否支持正则表达式,不然的话只能使用bash的通配符。

然后,一定要分清楚通配符和正则的区别:

通配符*表示任意字符(包括数量),而在正则中*表示任意数量个前一字符

通配符?表示一个字符,在正则中用.表示一个字符

正则表达式分为基础正则和扩展正则

 

基础正则:
^行首   
 $行尾    
.一个任意字符 *重复0个或者多个前一个字符     
\转义字符    \{n,m\}连续n到m个的前一重复字符,  \{n\}固定n个,\{n,\}n个以上   ({ 和 }在shell中是有特殊含义的)    
[  ]字符集,
一个字符,里面可以使用反向选择^
扩展正则:
+重复一个或多个前一字符    
?0个或一个字符,注意区别通配符中的?    
 |或           
 ( )将字符包起后,可一起操作

 

 注意,[  ]中的字符集跟编码由关,比如[a-z],是表示a的编码到z的编码之间所有的字符,但是这个不是统一的,比如,当LANG=zh_TW 时编码顺序是0 1 2 3 4 ... a A b B c C d D ... z Z

一些特殊符号:

特殊符号    代表意义  
[:alnum:]   代表英文大小写字元及数字,亦即 0-9, A-Z, a-z 
[:alpha:]   代表任何英文大小写字元,亦即 A-Z, a-z 
[:blank:]   代表空白键与 [Tab] 按键两者 
[:cntrl:]   代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等 
[:digit:]   代表数字而已,亦即 0-9 
[:graph:]   除了空白字元 (空白键与 [Tab] 按键) 外的其他所有按键 
[:lower:]   代表小写字元,亦即 a-z 
[:print:]   代表任何可以被列印出来的字元 
[:punct:]   代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $... 
[:upper:]   代表大写字元,亦即 A-Z 
[:space:]   任何会产生空白的字元,包括空白键, [Tab], CR 等等 
[:xdigit:]  代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字元 

 注意一点,这里的[ ]不能取代上面所说的[ ],比如[:digit:]表示0-9,如果要是用,外面还要再包一层[ ], [[:digit:]]

 grep的一些进阶选项:

[root@www ~]# grep [-A] [-B] [--color=auto] '搜寻字串' filename  
选项与参数: 
-A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来; 
-B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来; 
--color=auto 可将正确的那个撷取资料列出颜色 

 

 2.sed

灰常强大,灰常有用的工具,和awk一起称为流编辑的倚天剑屠龙刀啊,甚至可以看做是两门语言

sed是源于行编辑器ed的非交互式的流(stream-oriented)编辑器。记住它是一个编辑器,是和vi一类的东西。sed之所以称为“流”编辑器,是因为象大多数UNIX程序一样,输入流过它,然后被导向标准输出。sed编辑器逐行处理文件(或输入),把当前处理的行存储在称为“模式空间”(pattern space)的临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。sed处理完一行后将其从模式空间中删除,然后读入下一行进行处理和输出。应注意sed是对一行使用完了所有指令后再转到下一行的。sed的这种选择使得它可以方便地处理大文件(不必将整个文件一次读进内存)。sed是对文件副本进行编辑和修改,所以不用担心会修改或破坏原文件(除非是用了i参数)。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作和编写转换程序等。  

注意上面划线部分,要用它来理解sed中的所有操作

 要想完全掌握这个命令似乎要修炼很久啊,先把最基础的掌握吧

(感觉这篇文章还不错 )

 

用法:sed [-nefr] [动作]
-n,安静模式,配合动作p,列出处理行(不带n的p,会重复打印处理行)
-e,允许多次编辑,即一个sed有多种操作;操作是逐行进行的,在缓冲区中一次完成所有操作,所有操作顺序会对结果有影响
-f,将sed操作写在文件中,-f filename可以执行filename中的sed操作
-r,扩展正则
-i,修改写入源文件
动作说明:[定址] function
定址的形式可以是数字、正则,或者两者的结合。但是似乎不能多次定址?(比如‘1,3/RE/’,我原本的想法是在1到3行中有符合RE的行,但这是不合法的)
定位方式:
              x          
一行号
              x,y       
行号范围
              /pattern/ 
查询包含模式的行
              /pattern/pattern/     
查询包含两个模式的行
              /pattern/,x              
在指定行号上查询匹配模式的行
              x,/pattern/              
通过行号和模式查询匹配行
             /pattern1/,/pattern2/  查询两个模式之间的行(最小包含,查找到后继续以pattern1往后查找)
              x
,y!                  查询不包含行号x,y的行
function有下面这些操作:
a:新增(当前行下一行) 
c:替换   (替换整行)
d:删除  
i:插入(当前行上一行)
p:打印,同-n一起使用  
s:搜索,也可以替换   ;g是s的参数,表示替换
一行内所有符合的字符串,否则只替换一行内的第一个
例如:sed -n ‘1,20s/^fire/water/gp' file   将file中每行以fire开头的fire替换为water,并将替换的行全部打印出来
在上例中,s后面的RE应该不是定址,而是s附加的参数(/^fire/water/g),但是后面的p操作只打印了有字符串被替换的行,这是为什么呢?(这里的p属于替换的参数!!)
sed -n 's/\(La\)/\1kk/gp' dataf3  若数据行中有La字符串,则全部替换为Lakk打印出来
注意:注意参数和操作符的位置。
sed还能以脚本方式执行!!!
 
grep与sed的区别。grep ‘John’ datafile对应的sed命令是sed –n ‘/John/p’ datafile。区别:
(1)使用grep时,正则表达式没有包含在//分隔符中,而sed需要包含在//之间;
(2)sed默认会输出每一行,所以需要用-n命令阻止默认输出;
(3)返回状态。如果grep在文件中找到指定模式,将返回状态0,否则返回1。sed则
不管是否找到指定模式,它的退出状态都是0,只有命令存在语法错误时,sed的
退出状态才不是0。

转载地址:http://jtnsi.baihongyu.com/

你可能感兴趣的文章
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
查找最大值最小值
查看>>
杨辉三角
查看>>
冒泡排序法
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
16、Memento 备忘录模式
查看>>
Java基础篇(一)
查看>>
数据库
查看>>
mysql update与group by
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python猜拳游戏
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
python九九乘法表(详解)
查看>>
ESP8266 WIFI数传 Pixhaw折腾笔记
查看>>