[笔记] sed and awk
/ awk程序的典型示例是将数据转换成格式化的报表,当数据拥有某种结构时就能最好的体现awk的好处;可以使用awk脚本对数据的列重新排序,甚至可以将列变成行以及将行变成列;awk的功能将文本编辑的思想扩展到计算,使他有可能执行各种数据处理任务,包括分析、提取和数据报告。
/ 使用sed,必须了解一组单字母的命令;使用awk们必须了解程序设计语言的语句;
/ sed和awk都是从文本文件中一次一行的读取输入,并将输出直接送到标准输出端;区别在于他们控制所做的工作时所用的指令不同,这是一个主要的区别,而且这影响了这些程序最适于处理的任务类型。
/ awk起源于sed和grep,而不是ed(grep和sed起源于ed);
/ ed中's/regular/complex/'由于没有指定地址,所以他只影响当前行上的第一次出现,为了寻找同一行上的多次出现,必须指定g作为标志:'s/regular/complex/g';必须指定地址从而使该命令不只是对当前行操作:'/regular/s/regular/complex/g',这个命令影响文件中与这个地址匹配的第一行;要将他应用于所有的行,必须使用全局命令,即在地址前放置g:'g/regular/s/regular/complex/g';如果地址与模式相同,那么可以通过指定两个连续的丁姐夫(//)来告诉ed:'g/regular/s//complex/g';
/ grep来源于ed中的全局命令:'g/re/p',他表示“全局正则表达式打印”,grep是从ed中提取并可用作外部程序的行编辑命令,他将正则表达式作为命令行上的一个参数并将它用作要打印的行的地址;
/ sed命令是隐式的全局命令,在ed中,使用寻址扩大受命令影响的行数;在sed中,使用寻址限制受命令影响的行数;
/ awk与sed不同的地方是他废弃了行编辑器的命令集,它提供了效仿C语言的程序设计语言,例如,print语句取代p命令;但延续了寻址的概念,例如:'/regular/ {print}'
/ 在sed和awk中,每个命令都包括两部分:模式和过程,模式是由斜杠(/)分割的正则表达式,过程指定一个或多个将被执行的动作;当所有可用指令被解释并应用于单个行后,sed输出该行并循环处理每个输入行;而awk不自动输出,脚本中的命令控制awk最终所做的事情;
/ 3种指定命令行上的多重指令:1.用分号分割命令 sed 's/MA/ma/;s/PA/pa/' file 2.在每个指令前放置-e:sed -e 's/MA/ma/' -e 's/PA/pa/' file 3.在输入单引号后按ENTER键;
/sed中 -n选项可以阻止自动输出,当指定该选项时,每个要生成输出的指令都必须包括打印命令p;
/ awk中一个或多个连续的空格或制表符被看做一个定界符,awk允许在模式或过程中引用这些字段:$0表示整个输入行,$1、$2、……表示输入行上的各个字段;
/ 基本的元字符集是由ed引入的,而且在grep中可用,sed使用相同的元字符集;awk基本上使用与egrep相同的扩展的元字符集;
/ 基本元字符集:. * [] ^ $ \{n,m\} \(转义后面的特殊字符)
扩展的元字符集(egrep/awk):+ ? | () {n,m}
/ 如果要寻找单词的任意序列,他们也许出现在一行上,但也许被分成两行;解决:用到sed的保持空间
#!/bin/bash
# phrase -- 检查跨行的单词
# $1 = 查找的字符串;剩余参数 = 文件名
search=$1
shift
for file
do
sed '
/'"$search"'/b
N
h
s/.*\n//
/'"$search"'/b
g
s/ *\n//
/'"$search"'/{
g
b
}
g
D' $file
done
/ sed维护一种模式空间,即一个工作区或临时缓冲区,当应用编辑命令时将在哪里存储单个输入行;sed还维护了称为保持空间(hold space)的另一个临时缓冲区,可以将模式空间的内容复制到保持空间并在以后检索它们;
/ sed地址后面跟有感叹号,那么命令就应用于不匹配该地址的所有行:'/^\.TS/,/^\.TE/!d';
/ sed中的行号计数器不会因为多个输入文件而重置,因此不过指定多少个输入文件,在输入流中也只有一行1
/ sed使用大括号将一个地址嵌套在另一个地址中,或者在相同的地址上应用多个命令:
/^\.TS/,\.TE/{
/^$/d
}
左大括号必须在行末,而且右大括号本身必须单独占一行,要确保在大括号之后没有空格;
/ 例如:'s/^$/.LP/' 在替换命令的替代部分不必转义字面句点;
/ sed中在s命令的结尾添加全局标志以便取代所有的出现(不只是第一个);
/ sed的s命令中的定界符,不管是哪种定界符,如果他出现在正则表达式中或者替换文本中,那么就用反斜杠来转义他;
/ 在replacement部分。只有下列字符有特殊含义:
& 用正则表达式匹配的内容进行替换;
\n 匹配第n个子串(n是一个数字),这个子串在patten中用“\(”和“\)”指定;
\ 当在替换部分包含&,\和替换命令的定界符时可用\转义它们,另外可用于转义换行符来创建多行replacement字符串;
/ awk的BEGIN模式用于指定在第一个输入行读入之前要执行的动作,如果一个程序只有一个BEGIN模式,并且没有其他的语句,awk将不处理任何输入文件;
/ awk中如果没有指定操作,与模式匹配的输入行将被打印出来(执行打印语句是一个默认操作);
/ awk '{ print $2,$1,$3 }' file print语句中分割每个参数的逗号使得输出的各值之间有一个空格(也就是输出字段分隔符OFS);
/ 使用-F选型改变字段分隔符,后面跟着(紧跟或者有空白)分隔符;
/ 使用(~)操作符可以测试一个字段的正则表达式:'$5 ~ /MA/ { print $1 "," $6 }';也可使用(!~)来反转这个规则的含义;
/ 根据POSIX参数分析约定,选项“--”标记命令行选型的结束;
显示最后一列:awk '{print $NF}' file
[笔记] sed and awk的更多相关文章
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- sed and awk学习笔记
sed and awk 背景 awk起源追溯至sed和grep,进而追溯至共同的行编辑器ed.实用工具grep来源于ed命令:g/re/p .实用工具awk和sed有一个共同的选项-f用于指定脚本的名 ...
- 使用Sed和Awk实现批量文件的文本替换
摘要: 使用 Sed 完成文本替换操作任务是非常合适的.结合 find 命令,即可实现指定批量文件的文本替换.同时给出了Awk的解决方案作为对比. 问题 现在, 我要将一个原有Java项目中的一些包及 ...
- Sed、Awk单行脚本快速参考
文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...
- sh脚本学习之: sh脚本 、sed、awk
sh脚本 sh命令的批处理文件,支持更复杂的逻辑. Shell中的变量 参数 $0 当前脚本路径 $1....$n 脚本执行对应的第n个参数 条件判断 文件判断 test [op] path e存在 ...
- 一个利用sed和awk处理文本的小栗子
这两天做<Linux操作系统>课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享. 首先说题目是这样的,有这样一段文本: RECORD #这是多余的注释行 ...
- Pyp 替代sed,awk的文本处理工具
Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...
- 三大文本处理工具grep、sed及awk的简单介绍
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- sed和awk最佳入门教程
文档<sed和awk最佳入门教程>——摘自<实战linux shell编程与服务器管理>,简单易懂,适合初学者. 下载地址:http://download.csdn.net/d ...
随机推荐
- 解决MySQL版本之间造成的乱码、数据查询不出的问题
在数据库连接字符串上加 charset=utf8 <connectionStrings> <add name="XJRDSModels" connectionS ...
- HDU——2054A==B?
A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- input和textarea区别
1. input是单行文本,textarea是多行文本,可以带滚动条2. input的value放在标签里面 <input type="text" value="b ...
- 线程与threading模块
线程 进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位.在单个进程中同时运行多个线程完成不同的工作,称为多线程. 同一进程内的多个线程是共享该进程的资源. 创建新的线程开销 ...
- d3 根据数据绘制svg
, , , , ]; var circles = svg.selectAll("circle") .data(dataset) .enter() .append("cir ...
- Crash的数字表格 BZOJ 2154 / jzptab BZOJ 2693
jzptab [问题描述] 求: 多组询问 [输入格式] 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M [输出格式] T行 每行一个整数 表示第i组数据的结果 [样例输入] 1 4 ...
- vue2 如何通过router传递参数
当需要router-link传递参数的时候 vue2 如何做 记录下来备忘 1.通过vue页面传递参数 <router-link :to="{ path:'./attachment', ...
- 如何发布第一个属于自己的npm包
原文:https://segmentfault.com/a/1190000013940567 什么是NPM? NPM是随同NodeJS一起安装的javascript包管理工具,能解决NodeJS代码部 ...
- 标准C程序设计七---33
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- qt使用
1安装qt软件(.run文件) . chmod 777 qt.....run ./qt...run或sudo ./qt...run(安装目录不一样) 2.sudo gedit .bashrc添加以下内 ...