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 -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 <= 小于或等于 x<=y 算数运算符示例:+ - * / %(模) ^(幂2^3) 多条件模式 逻辑操作符和复合模式 && 逻辑与 a&&b 范围模式:awk '/从哪里/,/到哪里/' filename awk自定义内部变量 -v awk调用外部变量 “ ” 例如: var="bash" 条件&判断 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
== 等于 x==y
!= 不等于 x!=y
>= 大于等于 x>=y
> 大于 x>y
|| 逻辑或 a||b
! 逻辑非 !aawk脚本编程
echo "unix script" | awk "{print "123",\"$var\"}"
root