Shell学习:sed & gawk
Posted 漂亮姐姐1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell学习:sed & gawk相关的知识,希望对你有一定的参考价值。
虽然shell脚本本身完成很多事情,但是单凭shell脚本通常很难处理数据。Linux提供了两个方便的工具来帮助处理文本数据。
概述
sed & gawk 的介绍
sed编辑器介绍
作为一款流编辑器(对行进行编辑),其擅长对行信息进行操作(增删改查)
gawk程序介绍
gawk程序是一个来自GNU组织的工具,它模仿并扩展Unix中awk程序的功能。gawk程序内建了编程语言,可用来编写处理数据的脚本。可以用gawk程序从大型数据文件中提取数据元素,并将它们按照需要的格式输出。便于处理大型日志文件以及从数据文件生成定制报表。
sed & gawk 的使用
-
sed入门
# 测试文件 [root@smartgirl] cat data.txt abcsasadd asasf sasasabcsaas # 替换文本 [root@smartgirl] sed 's/abc/bcd/' data.txt # 多个命令 [root@smartgirl] sed -e 's/ab/bc/; s/cd/ef/' data.txt [root@smartgirl] sed -e ' >s/ab/cd/ >s/bc/ef/ >' data.txt # 从文件读取命令 [root@smartgirl] cat script.sed s/ab/cd/ s/bc/ef/ --------------------- sed -f script.sed data.txt # 为了避免混淆,可以给保存命令的脚本文件添加.sed后缀
-
gawk基础
# 接收到一行数据就进行处理,处理结果,输出Hello world! gawk '{print "Hello world!"}' # 要结束这个gawk程序,可以用Ctrl+d来产生一个EOF # 在gawk中, $0 --- 整行 $1 第一个字段 $2第二个字段 默认的FS是空白字符(空格,制表符等) # 指定FS是:,打印出每行的第一个字段 gawk -F: '{print $1}' /etc/passwd # 修改字段 echo "my age is 20"|gawk '{$4="18"; print $0}' # 多个命令 gawk '{ $4="18" print $0 }' # 将命令写到文件中 cat script.gawk {print $1 "'s home is " $6} --------------------------- gawk -F: -f script.gawk /etc/passwd # 处理命令前的输出语句 gawk 'BEGIN { print "-------begin--------"}' # 处理结束的输出语句 gawk 'END { print "--------end--------"}' # 使用 gawk 'BEGIN{print "------------begin---------"} {print $0} END{print "-----------end------------"} # 示例: cat script.gawk BEGIN{ print "The latest list of users and shells" print " UserID \\t Shell" print "------- \\t ------" FS=":" } { print $1 " \\t" $7 } END{ print "This concludes the listing" } ----------------------------- gawk -f script.gawk /etc/passwd
-
sed编辑基础
# sed命令有四种替换标记 数字,表明新文本将会替换第几个模式匹配的地方 g,替换全局匹配的地方 -- 默认就是全局的 p,打印出修改过的行 w file,将替换结果写到文件中 # sed命令默认会将修改后所有行输出(不管该行是否具有匹配项) # 替换第二个匹配的项 sed 's/test/trial/2' data.txt # 将修改了的行输出到文件test.txt中,不改变data.txt中原数据 sed 's/test/trial/w test.txt' data.txt # 将2-4行写入到文件中 sed '2,4w newfile.txt' data.txt # 只将修改过的行输出 sed -n 's/test/trial/p' data.txt # sed命令运行使用其他字符代替/ sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd # 对特定的行进行操作 sed '2s/test/trial/' data.txt #对第2行进行处理 sed '2,4/test/trial/' data.txt # 对2到4行进行处理 sed '2,$/test/trial/' data.txt # 对2行到最后一行进行处理 # 通过文本过滤行,对过滤行进行处理 sed 'user01/s/bash/csh' /etc/passwd [root@smartgirl~]# sed -n '/user01/s/bash/csh/p' /etc/passwd user01:x:1021:1021::/home/user01:/bin/csh # 删除行 sed 'd' data.txt # 删除所有行 sed '3d' data.txt # 删除第3行 sed '2,4d' data.txt # 删除2-4行 sed '3,$d' data.txt # 删除3-结束的所有行 sed '/user01/d' data.txt # 删除user01所在行 sed '/1/,/3/d' data.txt #删除有1的行到有3的行以及之间的所有行 # 注意:在有1的行就开始删除,有3的行就结束删除 # 如果再次出现有1的行就继续开始删除,如果没有再遇到有3的行,就会一直删除 # 插入和附加文本 i 在命令指定行前增加一个新行 insert a 在命令指定行后增加一个新行 append echo "Test Line 2"|sed "i\\Test Line 1" echo "Test Line 1"|sed "a\\Test Line 2" sed '3i\\Test Line' data.txt # 插到文件文本的第3行前 sed '$a\\This is the last line.' data.txt # 插到文末 sed '1i\\This is the first line.' data.txt # 插到文初 # 修改整行的内容 sed '3c\\this a total new line 3' data.txt # 替换第3行 # 修改单个字符 sed 'y/123/abc' data.txt # 1->a 2->b 3->c # 打印 # 有三种打印控制字符 # p 打印文本行 # = 打印行号 # l(小写L) 打印出行,并可显示不可见字符(制表符,换行符) [root@smartgirl ~]# sed -n '/user01/=' /etc/passwd 22 # 从文件中读取数据插入到数据流中,插入到匹配行的后面 sed '3r insert.txt' data.txt Line01 in data.txt Line02 in data.txt Line03 in data.txt line01 in insert.txt line02 in insert.txt Line04 in data.txt # 一个有趣的例子 cat data.txt following is a list LIST the list is in another file ------------------------------------- # 使用sed命令实现从另一个文件中读取LIST并替换到LIST的位置上 sed '/LIST/{ r list.txt d }' data.txt
以上是关于Shell学习:sed & gawk的主要内容,如果未能解决你的问题,请参考以下文章