Linux命令shell脚本编程学习笔记-18章初识sed和gawk

原创 2016年08月29日 19:51:27

第18章 初识sed和gawk

18.1 文本处理

sed编辑器
sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据。
它每次读取一行,用提供的编辑器命令匹配数据、按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT。在流编辑器将所有命令与一行数据进行匹配后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
sed命令格式:
sed options script file
sed命令选项
-e script 在处理输入时,将script中指定的命令添加到运行的命令中
-f file 在处理输入时,将file中指定的命令添加到运行的命令中
-n 不要为每个命令生成输出,等待print命令来输出

#替换
$echo "this is a test" | sed 's/test/big test/'
this is a big test

在命令行使用多个编辑器命令
使用-e即可。
注意:多个命令都写在同一对引号之间,并用分号隔开。并且在命令末尾和分号之间不能有空格。

sed -e 's/brown/green/';s/dog/cat/ data1

从文件中读取编辑器命令
如果有大量要处理的sed命令,可以将这些命令放入一个文件中,用-f指定文件
sed -f script data1

gawk程序
gawk程序是Unix中的原始awk程序的GNU版本,它提供了一种编程语言不只是编辑器命令。
在gawk编程语言中,可以做下面的事:
1.定义变量来保存数据
2.使用算数和字符串操作符来处理数据
3.使用结构化编程概念,比如if-then语句和循环
4.提取数据文件中的数据元素并将他们按另一顺序或格式重新放置。

gawk option program file
gawk选项
选项 描述
-F fs 指定行中分隔数据字段的字段分隔符
-f file 指定读取程序的文件名
-v var=value 定义gawk程序中的一个变量以及默认值
-mf N 指定要处理的数据文件中的最大字段数
-mr N 指定数据文件中的最大数据行数
-W keyword 指定gawk的兼容模式或警告等级

18.2 sed编辑器基础
默认情况下,对匹配的内容只会替换一次。如果想要改变这种方式,需要使用替换标识。一共有4中替换标识
s/pattern/replacement/flags
(1)数字,表明将替换第几处模式匹配的地方
s/pattern/replacement/number
(2)g,替换所有在文本中出现过的地方
s/pattern/replacement/g
(3)p,表示原来行的内容要打印出来
s/pattern/replacement/p
(4)w file,将替换的结果写到文件中去
s/pattern/replacement/w file

sed -n ‘s/test/trial/p’
这种情况下,会输出被改变过的行的内容

替换字符
转义符

使用地址
默认情况下,sed会对所有行使用命令,如果只想将命令作用于特定某些行,需要使用行寻址(line addressing)
sed中有两种形式的行寻址:
1.行的数字范围
2.用文本模式来过滤出某行
两种形式都使用相同的格式来指定地址:
[address] command
也可以为特定地址将多个命令放在一起:
address {
command1
command2
command3
}

数字方式的行寻址
sed ‘2s/dog/cat/’ data1
只修改第二行匹配的
sed ‘2,5s/dog/cat/’ data1
只修改第二行到第五行匹配的
sed ‘2,$s/dog/cat/’ data1
修改第二行到最后一行匹配的

使用文本模式过滤器
/pattern/command
该命令只会作用到匹配文本模式的行上。sed在文本模式中采用正则表达式。

组合命令
需要对单行执行多条命令的话,可以使用花括号将多条命令组合在一起
$ sed ‘2{
s/This/That/
s/test/good test/
}’ test.txt

删除行(delete)
删除行的命令为d,如果不指定行号,那么就全部删除。
sed ‘3d’data1
删除第三行
sed ‘4,7d’ data1
删除4-7行

插入和附加文本
插入(insert)命令i会在指定行前加一个新行
追加(append)命令a会在指定行后加一个新行
sed ‘[address]command\
new line’

echo “Test line 2” |sed ‘i\Test line 1’
Test line 1
Test line2

echo “Test line 2” |sed ‘a\Test line 1’
Test line2
Test line 1

修改行(change)
和之前的使用完全一样
使用地址区间的时候需要注意,sed会把区间中的所有内容作为一个整体用新行替换
sed ‘3c\
this is a change line of text’ data1
将第三行替换成this is a change line of text

转换命令
转换(transform,y)命令是唯一可用来处理单个字符的sed编辑器命令
格式如下:
[addressly/inchars/outchars/
转换命令会对inchars和outchars按顺序做一个一一映射。
如果inchars和outchars长度不同,sed则会产生错误信息

sed ‘y/123/789’ data1
对应数字进行替换

回顾打印
用来打印数据流中的信息的命令:
1.p,用来打印文本行
2.等号(=)命令,用来打印行号
3.l(小写L)命令,用来列出行
打印行
和替换命令中的p标记类似,p命令可以打印sed编辑器输出中的一行

sed -n ‘/3/{p;s/line/Line/p}’ test.txt

打印行号
sed ‘=’ data1

列出行
此命令允许打印数据流中的文本和不可打印的ASCII字符。
任何不可打印字符都用他们的八进制值前加一个反斜线或标准C风格的命名法。

cat data1
this line contains tabs.
sed -n ‘l’data1
this\tline\tcontains\ttabs.$

用sed和文件一起工作

向文件写入
[address]w filename

sed ‘1,2w test’ data1
将data1中第一行和第二行写入到文件test中

从文件读取数据
[address]r filename
读取命令允许将一个独立文件中的数据插入到数据流中。
sed ‘3r data2’data1
将data2中的文件读取插入到data1第3行的末尾

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《linux命令行与shell脚本编程大全》第三版 - 核心笔记(3/4):sed和gawk

《linux命令行与shell脚本编程大全》 全书4部分: ☆ 【1】linux命令行(1-10章) ☆ 【2】shell脚本编程基础(11-16章) ☆ 【3】高级shell脚本编程(17-...

shell脚本编程学习笔记(3)sed命令的使用

sed指令的简单介绍

Shell脚本高级编程 一 初识sed和gawk

到目前为止,shell脚本最常见的一个用途是处理文本文件。可以检查日志文件、可以读取配置文件以及处理数据元素,还可以帮助自动化处理文本文件中各种类型数据。但只用shell脚本命令处理文本文件内容有点勉...

《Linux命令行与shell脚本编程大全》 第十二章 学习笔记

第12章:更多的结构化命令 for 基本格式 for var in list do commands done 可以通过下面几种方式指定list列表 1.罗列 for var in A B ...
  • su1216
  • su1216
  • 2013年02月11日 12:09
  • 3397

《Linux命令行与shell脚本编程大全》 第十七章 学习笔记

第十七章:图形化桌面上的脚本编程 创建文本菜单创建菜单布局#!/bin/bash clear #清屏 echo -e "\t\tMenu" echo -e "1.\tDisplay disk spac...
  • su1216
  • su1216
  • 2013年09月05日 20:35
  • 3401

《Linux命令行与shell脚本编程大全》 第三章 学习笔记

第三章:基本的bash shell命令 bash程序使用命令行参数来修改所启动shell的类型 参数 描述 -c string 从string中读取命令并处理他们 -r...
  • su1216
  • su1216
  • 2012年11月26日 12:58
  • 4641

Linux命令与shell脚本编程学习笔记-16创建函数

16章 创建函数16.1 基本的脚本函数创建函数#用function关键字 function name{ commands } #函数名字后跟圆括号 name(){ commands ...

《Linux命令行与shell脚本编程大全》 第十六章 学习笔记

第十六章:创建函数 基本的脚本函数创建函数1.用function关键字,后面跟函数名function name { commands }2.函数名后面跟空圆括号,标明正在定义一个函数name(...
  • su1216
  • su1216
  • 2013年09月02日 16:03
  • 4147

《Linux命令行与shell脚本编程大全》 第二十一章 学习笔记

第二十一章:gawk进阶 使用变量gawk支持两种类型的变量:内建变量自定义变量内建变量字段和数据行分割符变量使用美元符号($)和数据字段在数据行中位置对应的数值来引用该数据行中的字段。比如,要引用数...
  • su1216
  • su1216
  • 2013年10月15日 15:13
  • 3702

《Linux命令行与shell脚本编程大全》 第二十六章 学习笔记

第二十六章:编写脚本实用工具 监测磁盘空间需要的功能du,显示文件和目录的磁盘使用情况查看一个目录的大小,我们可以这样:$ du --max-depth=0 -h android-sdk 6.1G a...
  • su1216
  • su1216
  • 2013年12月11日 15:58
  • 3202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux命令shell脚本编程学习笔记-18章初识sed和gawk
举报原因:
原因补充:

(最多只允许输入30个字)