【Linux】 字符串和文本处理工具 grep & sed & awk
Linux字符串&文本处理工具
因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要。这篇介绍三个常用的字符串处理工具,包括grep,sed和awk
■ grep
grep已经用得够多了不需要再特别地说明用法,就罗列一下几个不太熟悉的参数:
-v 反选 比如常用ps -ef | grep -v grep来把grep本身的那条进程去掉
-E 跟一个扩展正则表达式以增强grep的匹配功能。
-i 忽略大小写地匹配
-q (常用于脚本)进行一个grep的判断,如果找到了返回true,否则返回false
-w 和-E相对,去掉所有正则的转义,准确匹配某个pattern
-n grep的输出中带有匹配到项所在行的行号
-r 递归地抓取整个目录
-(数字n) 输出匹配项所在行的前n行和后n行的内容
■ sed 以行为单位的替换、新增、删除工具
sed既可以做为一个独立命令出现也可以出现在管道右边
当sed出现在管道右边的时候,其对左边过来的内容进行一些处理。而当sed独立出现时可以加参数-i后面接上一个文件,可以直接编辑文件的内容。如果觉得直接改不太保险可以用参数-i.bak(没错,直接加上.bak),sed会自动为源文件搞一个.bak的备份文件。
● sed用法:
sed [OPTION] [ACTION] [FILE]
action的部分基本上是这样的:'[n1[,n2]]function',如果想要连续执行多个action的话那么可以用-e参数。就是sed -e 'action1' -e 'action2'这样的形式。也可以直接用分号:sed 'action1;action2'这样的形式。
n1和n2为可选项,可以用数字或者^,$符号,代表某些特定的行(^表示首行,$的话表示最后一行),表示后面的function在指定的这一行或几行之间展开。
而function有以下参数:
a:指append,后接上字符串,意思是在指定行后面新加入一行,内容为a后面跟的字符串。比如sed -i '2 a INSERTTEXT' test.txt就可以在test.txt现在的第二行后面加上一行,内容是"INSERTTEXT"
d:指delete,删除指定一行或多行,注意d参数是跟在行号后面的,比如sed '2,5d' test.txt就是删除了文件中的第2至5行
i:指insert,后接上字符串,和append相对,在指定行的上方加入一个新行
s:指substitute,最常用的一个参数,其基本格式是's/old/new/[n]',old是被替换的字符串,new是新替换进的字符串,而n是一个可选项,可以写数字或者g。数字的意思是只替换一行中的第n个old,而g是指替换全部old,如果写了ng就是说替换第n个old之后到行末的所有的old
y:用参数y可以对原文进行字符级别的替换,y的用法和s类似,如'y/OLD/NEW/',相当于把原文中所有的O替换成N,L换成E,D换成W。显然,要求OLD和NEW的长度应该相等,否则sed会报错。
&:表示已经匹配到的字符串,通常用在正则匹配中,比如's/正则表达式/&ok/g'表示把所有匹配正则表达式的字符串后面都加上ok。
/:'/pattern/'的作用就是定位含有pattern的行。它可以替代n1,n2那样死板的指定行的方法。比如sed '/pattern/!i INSERT'就是除了匹配到pattern的行,其余地行在前面一行都插入内容为INSERT的一行新行。
!:写在参数前面否定,比如'/pattern/!d'就是不删除匹配到pattern的行
p:常用在s的最后参数位置,即's/old/new/p'的形式。这么做可以让sed在输出显示的时候只输出被修改过的行。这么做的话需要配上命令的参数-n,最后的命令应该是像sed -n 's/old/new/p' test.txt这样的形式。
● sed脚本
sed -f <script> <file>可以应用sed脚本script到file中。sed脚本中每一行都写有一个action,应用到一个文件之后就按顺序逐条sed执行。最后sed会把处理完所有function的文件内容输出到stdout上。当sed的需求比较复杂时可以考虑这么干。
sed的参数很多,再配合上正则表达式就使得功能十分强大了,但同时也使得功能超级复杂。。我的感觉是,如果复杂度到达一定程度的话,还不如用更加熟悉的python来解决。总之上面罗列的都是些常用的sed参数,如果想要更加详细的可以那本蓝蓝的shell脚本实践指南P155,上面有更加全的参数列表和用法。以上。
■ awk 以列为单位的文本处理工具
awk会遍历读取文件的每一行然后经过一些处理把它视作一条记录来进行数据的读取。和sed一样,awk可以作为独立命令或管道右边两种方式出现。其基本用法的格式是awk <pattern> <file>。pattern是用户根据自己需要些的一个awk表达式。
awk默认以空格作为分隔符,对每一行的内容进行自动的分隔操作。每一个被分隔出来的部分被称为域(field),在awk的表达式中用$n来表示。$0表示读取到的整行内容,$1表示第一个域,$2表示第二个以此类推。比较经典的一个应用如下:
test.txt内容:
Frank 22 Male 13512345678
Bob 23 Male 13587654321
然后执行awk '{print $1"s number is "$4}' test.txt输出就是Franks number is 13512345678\nBobs number is 13587654321
可以注意到,s number is这部分是常量,需要用引号特别括起来。而print语句需要用大括号括起来
● 自定义分隔符
如果不要空白作为分隔,而想自己制定的话可以用-F <sep>来指定分隔符
● 内置变量
awk内置了几个变量供用户使用,比如:
NF 当前行的字段总数
NR 当前行是第几行
FS 当前的分隔符,默认是space
这些变量可以给awk表达式加上一些条件。比如awk 'NR!=1{print $1}'打印出除了第一行外所有行的第一个字段
● 表达式条件
正如上面这个例子,在进行操作之前可以有些判断条件,判断条件式写在print之前,相当于让awk在输出前做一个判断。同时也可以应用上FS这些变量。比如:
awk -F : '$3<10 {print $1}' test.txt的意义就是以冒号为分隔符读取每一行,且当该行的第三个域的值小于10的情况下才打印出这行的第一个域的值。
判断式中条件可以是<,>,<=,>=,==,!=等。
和sed一样,awk有自己的一套表达式语言,功能强大但复杂,上述常用的可以用,实在用不出来就看看文档或者用python把。。
【Linux】 字符串和文本处理工具 grep & sed & awk的更多相关文章
- Linux基础命令-Nginx-正则表达式( grep sed awk )-Shell Script--etc
Linux基础使用 学习内容博客 内存 查看swap分区信息 > swapon -s 添加swap分区 > mkswap /dev/sdb2 > 激活 swapon -a /dev/ ...
- Linux的文本处理工具浅谈-awk sed grep
Linux的文本处理工具浅谈 awk 老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS ...
- 开发环境入门 linux基础 (部分)正则表达式 grep sed
/etc/profile /etc/bashrc .变量添加到shell环境中,永久生效. /root/.bashrc /root/.bash_profile 正则表达式 定义:正则就是用一些具有特 ...
- Linux三剑客grep/sed/awk
grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...
- linux三剑客grep|sed|awk实践
最好先学习正则表达式的基本用法,以及正则表达式BREs,EREs,PREs的区别 此坑待填 grep sed awk
- 5_find grep sed awk 详解
find :查找文件系统中指定的文件.可以按文件名(-name) 权限(-perm) 归属人 查找. find 要查找文件的路径 表达式 *通配符 可以添加在文件名的任意位置 常用的例子( ...
- Linux 文本处理工具grep,sed,awk
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- shell之三大文本处理工具grep、sed及awk
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- 三大文本处理工具grep、sed及awk
一. 用grep在文件中搜索文本 grep能够接受正则表达式,生成各种格式的输出.除此之外,它还有大量有趣的选项. 1. 搜索包含特定模式的文本行: 2. 从stdin中读取: 3. 单个g ...
随机推荐
- 微信 Tinker 的一切都在这里,包括源码
最近半年以来,Android热补丁技术热潮继续爆发,各大公司相继推出自己的开源框架.Tinker在最近也顺利完成了公司的审核,并非常荣幸的成为github.com/Tencent上第一个正式公开的项目 ...
- android DecorView深入理解
开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局.页面都是依附在窗口之上的,而DecorView即是窗口最顶 ...
- Java Web项目报错总结
Java Web项目报错总结 1.java.lang.IllegalStateException java.lang.IllegalStateException Caused by:java.lang ...
- Ubuntu12.04LTS安装好后是空白桌面的解决步骤(更新显卡驱动)
安装完毕启动后,明显慢的要死,登陆后竟然是一个空白的桌面环境,Ctrl+Alt+T 根本没有任何反应.唯一的反应就是右键能够创建文件和文档. 同时打开的窗口没有最大化,最小化及关闭按钮. GOOGLE ...
- Linux开机启动图片修改
Linux启动时会在屏幕上显示一个默认的开机图片,我们可以修改成为自己的图片,需要做以下工作 软件gimp下载地址:http://www.rayfile.com/zh-cn/files/0bb556b ...
- RTP、RTCP、RTSP 概念
用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制.同步. 之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码 ...
- Adobe RIA 开发工程师认证考试大纲
AdobeRIA 开发工程师认证考试大纲 考题数量:共90道题,考试通过正确率:60% 考试时间:120分钟 试题种类:单选题.多选题和判断题 1. Adobe RIA基础知识(2道题) ...
- TCP粘包、拆包及解决
TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议.那么UDP是否会发生粘包或拆包的现象呢?答案是不会.UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示 ...
- freemarker处理map的数据(二十)
1.简易说明 (1)map取值 (2)key取值 2.实现示例 <html> <head> <meta http-equiv="content-type&quo ...
- 简述Spring事务有几种管理方法,写出一种配置方式
Spring事务有两种方式: 1.编程式事务:(代码中嵌入) 2.声明式事务:(注解,XML) 注解方式配置事务的方式如下: 首先,需要在applicationContext.xml中添加启动配置,代 ...