sed和awk的简单使用
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以 行 为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法。
语法:
sed [-nefri] ‘command’ file(s)
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到荧幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行才会被列出来。(stdin是标准输入,一般指键盘输入到缓冲区里的东西。 )仅显示sed处理后的结果。
-e∶直接在指令列模式上进行 sed 的动作编辑(即 多点编辑,在前一个命令后继续执行编辑命令);
-f∶直接将 sed 命令 写在一个文件内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的文件内容,而不是由萤幕输出。(一般sed是不会改变源文件内容的,如果想直接修改原文件内容可以用该参数)
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(当前的下一行)
c ∶代替, c 的后面可以接字串,这些字串可以替代 n1,n2 之间的行!
d ∶删除, 因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(当前的上一行);
p ∶列,亦即打印模板块的行。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!(s可以搭配g来使用,g 表示行内全面替换,这样就可以全局取代啦!)
(sed 's/要被取代的字串/新的字串/g')
例如 1,20s/old/new/g 。
sed常用元字符集;
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
实例:
新增(插入)内容:
sed '2a hello,world' passwd #在passwd文件的第二行 后 加入“hello,world”
sed '2,5a hello,word' passwd #在passwd文件的第二行至第五行每行 后 都加入“hello,world”
sed '2i hello,world' passwd #在passwd文件的第二行 前 加入“hello,world”
sed '2,5i hello,world' passwd #在passwd文件的第二行至第五行每行 前 都加入“hello,world” 代替:
sed '1c hello' passwd #将第一行用“hello”代替
sed '2,5c hello' passwd #将第二行到第五行都用“hello”代替
sed '2,$c hello' passwd #将第二行到最后都用“hello”代替 替换一行中的某部分:
sed '1,3s/root/abc/' passwd #替换第一行到第三行,将root替换为abc
sed 's/root/abc/g' passwd #全局替换,将root替换为abc
sed 's/root//g' passwd #删除所有字符串‘root’
sed -n '/root/p' passwd | sed 's/root/123/g' #查询包含关键字‘root’的行,然后将root替换为123
删除某行:
sed '1d' passwd #删除第一行
sed '$d' passwd #删除最后一行
sed '1,2d' passwd #删除第一行到第二行
sed '2,$d' passwd #删除第二行到最后一行 显示某行:
sed -n '1p' passwd #显示第一行
sed -n '$p' passwd #显示最后一行
sed -n '1,2p' passwd #显示第一行到第二行
sed -n '2,$p' passwd #显示第二行到最后一行
sed -n '/root/p' passwd #查询所有包含关键字‘root’的行
sed -n '/\$/p' passwd #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
注释:
①如果上面这些加上 ‘-i’ 选项,则就是∶直接修改读取的档案内容,而不是由萤幕输出。(一般sed是不会改变源文件内容的,如果想直接修改原文件内容可以用该参数)。
②‘-e’ 选项的用法,例,sed -e '3,$d' -e 's/bash/test/g' passwd #-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为test。
扩展:
.sed定位间隔几行输出:
sed -n "1~2" passwd 从第1行开始每次间隔2行输出一次。 .删除空行:
sed -i "/^$/d" passwd .sed 组合多个表达式:
sed '表达式' | sed '表达式'
等价于:
sed '表达式; 表达式' 例,nl passwd | sed '{20,30d;s/false/true}' 用分号(";")分割多个命令,实现多命令同时执行。
或
nl passwd | sed '20,30d' | sed 's/false/true' 4. 从文件读入:r命令 file里的内容被读入filename里面,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:
sed '/test/r file' filename
例,sed '/root/r passwd' shadow 5.写入文件:w命令 在example中所有包含test的行都被写入file里:
sed -n '/test/w file' example
例,sed -n '/root/w shadow' passwd
************************************AWK*********************************************
awk是一种解释型的编程语言,用于在linux/unix下对文本和数据进行处理。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
语法:
1.命令行格式:
命令行格式又分两种:
①awk [options] 'command' file(s)
②awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file(s)
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file(s)
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句块。
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
例,awk -F ':' '{print $1}' passwd
awk -F ':' 'BEGIN{print "Line Col User"}{print NR,NF,$1}END{print FILENAME}' passwd
常用命令选项:
-F fs fs为指定的输入分隔符,fs可以是字符串或正则表达式,如-F ':'
-v var=value 赋值一个用户定义变量。,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令 #例,awk -f {awk脚本} {文件名} awk -f cal.awk log.txt
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
关于awk脚本,我们需要注意两个关键词BEGIN和END:
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
常用内置变量:
1.NR 显示行号
2.NF 显示每行的字段数量
3. $NF 表示的最后一个列,即输出最后一个字段的内容
4. $NR
5.FILENAME 显示正在处理的文本的名称
awk的流程控制语句:
在linux awk的while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序都可以交给awk,而且性能是非常快的。下面是各个语句用法。
1.if语句;
if(表达式) 或 if(表达式)
语句1 {语句1}
else else if(表达式)
语句2 {语句2}
else
{语句3}
例,awk -F ':' 'BEGIN{count=0}{if($3>=100){count+=1 print $1,$3}}END{print "UID大于等于100的用户共:"count"个"}'
(先初始化count=0,然后使用if判断,最后统计共有几个并将用户名和UID打印出来$1,$3。)
2.for循环语句:
for(变量 in 数组) 或 for(变量;条件;表达式)
{语句} {语句}
3.while循环语句:
while(表达式)
{语句}
正则运算符:
运算符 描述
~ 匹配正则表达式和
~! 不匹配正则表达式
实例:
awk -F ':' '{print $1,$}' passwd #每行安给定的分隔符':'来分割,并输出文本中的1,2项 awk -F ':' -v x= '{print $x}' passwd #定义一个变量x,将变量的值传递给awk
or x=
awk -F ':' -v val=x '{print $val}' passwd awk -F '[/,:]' '{print $1}' passwd #定义多个分割符 awk '$1>2' log.txt #过滤第一列大于2的行
awk -F ':' '$1=="root"' passwd #过滤第一列等于字符串“root”的行
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #过滤第一列大于2并且第二列等于'Are'的行 awk '$2 ~ /th/ {print $2,$4}' log.txt # 输出第二列包含 "th",并打印第二列与第四列
awk '/re/ ' log.txt # 输出包含"re" 的行
注意:~ 表示模式开始。// 中是模式。 awk -F ':' '{print NF}' passwd #显示有多少列 awk -F ':' '{print NR}' passwd #显示有多少行 awk -F ';' ‘{print FILENAME}’ passwd #显示当前处理的文件名 awk -F ":" 'BEGIN{print "start..."} {print NF} END{print "end..."}' passwd
awk -F ":" 'BEGIN{pritn "start..."}{if($1=="root"){print $1}else{print NF}}END{print "end..."}' passwd
扩展:
1.print和printf
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。 printf函数,其用法和C语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
sed和awk的简单使用的更多相关文章
- 三大文本处理工具grep、sed及awk的简单介绍
grep.sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了.只不过,相比较而言,sed和awk功能更 ...
- Sed 静默替换文件内容 以及 awk 的简单使用
1. Sed的help 鸟哥说的 学东西 先看 help 先看man 再google 不好FQ再百度.. Usage: sed [OPTION]... {script-only-if-no-other ...
- Sed、Awk单行脚本快速参考
文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...
- 一个利用sed和awk处理文本的小栗子
这两天做<Linux操作系统>课程的作业,碰到了一个题目,感觉很有意思,很考验对awk掌握的熟练度,故特意拿来分享. 首先说题目是这样的,有这样一段文本: RECORD #这是多余的注释行 ...
- Pyp 替代sed,awk的文本处理工具
Linux上文本处理工具虽不少,像cut,tr,join,split,paste,sort,uniq,sed,awk这些经典工具让人眼花缭乱,而且都太老了,使用方法都不太人性化,尤其awk,语法简直反 ...
- sed and awk学习笔记
sed and awk 背景 awk起源追溯至sed和grep,进而追溯至共同的行编辑器ed.实用工具grep来源于ed命令:g/re/p .实用工具awk和sed有一个共同的选项-f用于指定脚本的名 ...
- sed和awk最佳入门教程
文档<sed和awk最佳入门教程>——摘自<实战linux shell编程与服务器管理>,简单易懂,适合初学者. 下载地址:http://download.csdn.net/d ...
- linux(5)--补充(管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
本节中正则表达式的工具程序 grep,sed和awk是重点,也是难点!!! 先补充一下一. 管道| / 重定向> / xargs 如:1. 管道和重定向的区别:具体可以见 http://www. ...
- sed和awk用法
sed和awk用法 Sed sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为 ...
随机推荐
- QTCreator增加帮助文档
1.下载QT库的帮助文档,是qch格式的. 2.在QTCreator的->Tools->Options->Help->Add增加下载的qch文件即可.
- Unity3d粒子特效:制作火焰效果
效果 分析 真实的火焰效果,通常包括:火.火光.火星等组成部分,而火焰对周围环境的烘焙,可以通过灯光实现,如点光源. 针对火焰组成部分,我们可以创建对应的粒子系统组件,实现相应的效果,如下图所示: 1 ...
- 视口viewport与单位rem的本质
结论: 视口viewport的设置是为了让字的显示在不同的屏幕下保持一致. 单位rem的使用是为了让页面中的布局元素的比例在不同的屏幕下显示的比例保持一致. 现象: 我们看电脑时候的网页的时候的字体大 ...
- csps模拟测试50反思
又考崩了,T1一眼秒掉错误思路,然后迅速码完,并码完错误暴力,对拍拍上,以为AC.T2想到了二维莫队,发现是子任务就没去打,一直在想别的,T3最后想到60分打法,没有打完,也没时间暴力,挂掉.T2还有 ...
- 精心整理(含图版)|你要的全拿走!(R数据分析,可视化,生信实战)
本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/ZEjaxDifNATeV8fO4krOIQ更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. 为 ...
- 用css或js实现文本输入框的特效
1文本框默认点击特效: 点击文本框,外围会出现蓝色阴影,取消该特效,为该文本框添加css样式"outline:none;",就取消了默认特效. 2实现百度搜索框点击特效: 点击文本 ...
- 『题解』UVa11324 The Largest Clique
原文地址 Problem Portal Portal1:UVa Portal2:Luogu Portal3:Vjudge Description Given a directed graph \(\t ...
- php 环境require(): open_basedir restriction in effect 错误
php 环境require(): open_basedir restriction in effect 错误 错误日志显示,访问脚本不在 open_basedir的限定目录里面 解决方法打开fastc ...
- Windows系统下搭建WAMP环境
Wamp就是Windos Apache Mysql PHP集成安装环境,即在window下的apache.php和mysql的服务器软件.其中php环境配置是至关重要的一部分,本文就针对php在本地的 ...
- 生信 - 从repeatmasker传送门过来的 blast
以前有的是非完整时间写的博客,抽时间需要统一整理一下. 今天在重新装repeatmasker. 整个过程是这样的,有关联的事情有两个. 1. 装repeatmasker需要各种Prerequisite ...