shell编程之sed和awk详解,非常详细!

sed

 sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作。

格式一: sed   选项  命令 文件    sed [options] 'command' file(s)

格式二: sed     选项 –f 脚本 文件    sed [options] -f scriptfile file(s)

sed的$?返回值都是0,对错不管,只有当命令出现语法错误时,sed的退出状态才是非0

sed和正则表达式:与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。使用基本元字符集    ^, $, ., *, [], [^], \< \>,\(\),\{\}
使用扩展元字符集    ?, +, |, ( )

使用扩展元字符的方式:\+           转义      sed -r      加-r

命令汇总示例:

删除命令:   d   示例:sed -r '3,$d' passwd  删除从第三行到最后一行

替换命令:   s   示例:sed -r 's/root/dabai/g' passwd 将root替换成dabai,g 全局替换    sed -r 's#(mail)#E\1#g' passwd 把mail换成Email,#是用来替换/的,\1调用前面()中的参数

读文件命令:r   示例:sed -r '$r 1.txt' passwd 在最后一行中读取新文件

写文件命令:w(另存为)  示例:sed -r 'w 111.txt' 1.txt 把1.txt的内容全部写入到111.txt

追加命令:   a(之后)  示例:sed -r 'a123' passwd 每行后面都加上123,sed -r '1a123' 在第一行后面加上123

插入命令:   i(之前)   示例:sed -r '2iaaaaaaaa' passwd 在第二行插入新的一行

插入多行命令: sed -r '2ibbbbbbb\
> cccccccc\
> ddddddd' passwd   在第二行前面插入三行

替换整行命令:   c    示例:sed -r '2caaaaaaaa' passwd  把第二行的整行替换为c后面的内容

获取下一行命令:n    示例:sed -r '/root/{n;d}' passwd n下一行的意思,d删除的意思,找到root的下一行,然后删除,这里也可以进行替换,例如:sed -r '/root/{n;s/bin/ding/g}' passwd   找到root的下一行,进行替换,将bin替换为ding

反向选择:      !       示例:sed -r '2,$!d' passwd  2行到最后一行,取反删除,也就是说只删除第一行

多重编辑 :   e等于;  示例:sed -r -e '1,3d' -e '4s/adm/admin/g' passwd  1到3行执行删除,4行adm替换成admin

sed -r  '1,3d;4s/adm/admin/g' passwd   等同于上面的例子,只是-e换成了;

暂存空间  hHGgx  暂存和取用命令:h覆盖暂存空间 H追加暂存空间 g覆盖行 G追加行 x 交换模式和保持

示例一:sed -r '1h;$G' passwd    第一行覆盖到暂存空间;将暂存空间的内容追加到最后一行

示例二:sed -r '1{h;d};$G' passwd  第一行进入暂存空间,第一行在模式空间中删除,将暂存空间追加到最后一行,就像移动。

示例三:sed -r '1h;2,$g' passwd 第一行进入暂存空间;将暂存空间覆盖在,2到最后一行,

示例四:sed -r '1h;2,3H;$G' passwd   第一行进入暂存空间;2,3行追加进攒存空间;将暂存的内容追加到最后一行

 示例五:sed -r '4h;5x;6G' passwd   第四行进入暂存空间;将模式空间第五行和暂存空间互换,将暂存空间的内容追加到第六行。

awk

awk工作原理:awk -F: '{print $1,$3}' /etc/passwd
(1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束

(2)然后,行被:(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始,$1是第一个字段,以此类推,$2是第二个字段等等,最多达100个字段

(3)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔
成字段并进行处理。该过程将持续到所有行处理完毕

awk语法:awk   选项   '命令'      文件名 (推荐)   awk   [options]   'commands'      filenames 

选项:例如:-F 定义输入字段分隔符,默认的分隔符是空格或制表符(tab) ,也可以 -F: 以冒号作为分隔符

命令:BEGIN{}   {}    END{}              BEGIN{} begin发生在行处理前(注意大写)       

 {}行处理时,读一行执行一次                   

END{}   行处理后       

内部变量 

FS:输入字段分隔符(默认空格)示例:awk -F: '{print $1, $3}' /etc/passwd | head -1 以冒号为分隔符,打印出第1和第3字段

OFS:输出字段分隔符 示例:awk -F: 'BEGIN{FS=":";OFS="+++"}{print $1,$2,$3,$4}' /etc/passwd | head -1 以冒号为分隔符,打印出第1,2,3,4四个字段,字段之间用+++作为分隔符

RS:输入记录(行)分隔符,默认换行符 示例:awk 'BEGIN{RS="   "}{print $0}' a.txt  用空格作为行分隔符进行输出

ORS:输出记录(行)分隔符,默认换行符 示例:awk 'BEGIN{RS=" ";ORS="+++"}{print $0}' a.txt  输出记录分隔符换成了“+++”

FNR:多文件独立编号  示例:awk -F: '{print FNR, $0}' /etc/centos-release /etc/hosts 文件中有两个1的编号,两个文件编号不一

NR:多文件汇总编号 示例:awk -F: '{print NR, $0}' /etc/centos-release /etc/hosts 文件中只有一组编号,两个文件不分你我

NF:字段总数  示例:awk -F: '{print NF, $NF}'  /etc/passwd 打印出字段总数以及打印出第 字段总数个数 的字段

格式化输出 print  函数: 示例:awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd | head -1

printf 函数  示例:awk -F: '{printf "%-10s %-10s %-15s\n", $1,$2,$3}' /etc/passwd | head 

%s 字符类型;%d 数值类型;%f 浮点型,可以定义保留;占15字符;- 表示左对齐,默认是右对齐;printf默认不会在行尾自动换行,加\n;, 逗号,输出字段分隔符

模式(正则表达)和动作

字符串比较 :示例:awk '$0!~/^root/' /etc/passwd 查找出一行中不以root开头的行

数值比较

关系运算符 运算符 含义 示例:<     小于             x<y

<=     小于或等于     x<=y
==     等于             x==y
!=     不等于        x!=y
>=     大于等于         x>=y
>     大于             x>y

算数运算符示例:+ - * / %(模) ^(幂2^3) 

多条件模式

逻辑操作符和复合模式

&& 逻辑与 a&&b
|| 逻辑或 a||b
! 逻辑非 !a

范围模式:awk '/从哪里/,/到哪里/' filename

awk脚本编程

awk自定义内部变量 -v

awk调用外部变量 “ ” 例如: var="bash"
 echo "unix script" | awk "{print "123",\"$var\"}"

条件&判断

if语句:{if(表达式){语句;语句;...}}

if...else语句 :{if(表达式){语句;语句;...}else{语句;语句;...}}

if...else if...else语句:{if(表达式1){语句;语句;...}else if(表达式2){语句;语句;...}else if(表达式3){语句;语句;...}else{语句;语句;...}}

定义数组 

示例:将用户名定义为数组的值,打印第一个值 awk -F: '{username[++i]=$1} END{print username[1]}' /etc/passwd
root

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值