三剑客(一)
awk实例
Awk变量
1.$0保存当前记录的内容 # awk '{print $0}' /etc/passwd
2.NR记录输入总的编号(行号) # awk '{print NR,$0}' /etc/passwd # awk 'NR<=3' /etc/passwd
3.FNR当前输入文件的编号(行号) # awk '{print NR,$0}' /etc/passwd /etc/hosts # awk '{print FNR,$0}' /etc/passwd /etc/hosts
4.NF保存行的最后一列 # awk -F ":" '{print NF,$NF}' /etc/passwd /etc/hosts
5.FS指定字段分割符, 默认是空格 以冒号作为字段分隔符 # awk -F: '/root/{print $1,$3}' /etc/passwd# awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd 以空格冒号tab作为字段分割 # awk -F'[ :\t]' '{print $1,$2,$3}' /etc/passwd
6.OFS指定输出字段分隔符 ,逗号映射为OFS, 初始情况下OFS变量是空格 # awk -F: '/root/{print $1,$2,$3,$4}' /etc/passwd# awk 'BEGIN{FS=":"; OFS="+++"} /^root/{print $1,$2}' /etc/passwd
7.RS输入记录分隔符,默认为换行符[了解] # awk -F: 'BEGIN{RS=" "} {print $0}' /etc/hosts
8.ORS将文件以空格为分割每一行合并为一行[了解] # awk -F: 'BEGIN{ORS=" "} {print $0}' /etc/hosts
9.printf格式化输出函数 # awk -F: '{print "用户是:" $1 "\t 用户uid: " $3 "\t 用户gid:" $4}' /etc/passwd printf 函数 # awk -F: '{printf "%-15s %-10s %-15s\n", $1, $2, $3}' /etc/passwd %s 字符类型 %d 数值类型 占 15 字符 - 表示左对齐,默认是右对齐 printf 默认不会在行尾自动换行,加\n
Awk模式动作
1.正则表达式 匹配记录(整行) # awk '/^root/' /etc/passwd
# awk '$0 ~ /^root/' /etc/passwd 匹配字段:匹配操作符(~ !~) # awk '$1~/^root/' /etc/passwd
# awk '$NF !~ /bash$/' /etc/passwd
2.比较表达式 关系运算符 运算符 含义 示例 < 小于 x<y <= 小于或等于 x<=y == 等于 x==y != 不等于 x!=y >= 大于等于 x>=y > 大于 x>y uid为0的列出来 # awk -F ":" '$3==0' /etc/passwd uid小于10的全部列出来 # awk -F: '$3 < 10' /etc/passwd 用户登陆的shell等于/bin/bash # awk -F: '$7 == "/bin/bash" ' /etc/passwd 第一列为alice的列出来 # awk -F: '$1 == "alice" ' /etc/passwd 为alice的用户列出来 # awk -F: '$1 ~ /alice/ ' /etc/passwd
# awk -F: '$1 !~ /alice/ ' /etc/passwd 磁盘使用率大于多少则,则打印可用的值 # df |awk '/\/$/'|awk '$3>1000000 {print $4}'
3.条件表达式 # awk -F: '$3>300 {print $0}' /etc/passwd
# awk -F: '{if($3>300) print $0}' /etc/passwd
# awk -F: '{if($3>5555){print $3} else {print $1}}' /etc/passwd
4.运算表达式 # awk -F: '$3 * 10 > 500000' /etc/passwd
# awk -F: 'BEGIN{OFS="--"} { if($3*10>50000) {print $1,$3} } END {print "打印ok"}' /etc/passwd
# awk '/southem/{print $5 + 10}' datafile # awk '/southem/{print $5 + 10.56}' datafile # awk '/southem/{print $8 - 10}' datafile # awk '/southem/{print $8 / 2 }' datafile # awk '/southem/{print $8 * 2 }' datafile # awk '/southem/{print $8 % 2 }' datafile
5.逻辑操作符和复合模式 &&逻辑与 || 逻辑或 !逻辑非 匹配用户名为root并且打印uid小于15的行 # awk -F: '$1~/root/ && $3<=15' /etc/passwd 匹配用户名为root或uid大于5000 # awk -F: '$1~/root/ || $3>=5000' /etc/passwd
6.awk示例1 # awk '/west/' datafile # awk '/^north/' datafile # awk '$3 ~ /^north/' datafile # awk '/^(no|so)/' datafile # awk '{print $3,$2}' datafile # awk '{print $3 $2}' datafile # awk '{print $0}' datafile # awk '{print "Number of fields: "NF}' datafile # awk '/northeast/{print $3,$2}' datafile # awk '/^[ns]/{print $1}' datafile # awk '$5 ~ /\. [7-9]+/' datafile # awk '$2 !~ /E/{print $1,$2}' datafile # awk '$3 ~ /^Joel/{print $3 "is a nice boy."}' datafile # awk '$8 ~ /[0-9][0-9]$/{print $8}' datafile # awk '$4 ~ /Chin$/{print "The price is $" $8 "."}' datafile # awk '/Tj/{print $0}' datafile # awk -F: '{print "Number of fields: "NF}' /etc/passwd # awk -F"[ :]" '{print NF}' /etc/passwd
7.awk示例2 # cat b.txt bgx xuliangwei:is a:good boy!
# awk '{print NF}' b.txt # awk -F ':' '{print NF}' b.txt # awk -F"[ :]" '{print NF}' b.txt
Awk条件判断
1.单分支
if语句格式:{ if(表达式){语句;语句;... }} 打印当前管理员用户名称 # awk -F: '{ if($3==0){print $1 "is adminisitrator"} }' /etc/passwd 统计系统用户数量 # awk -F: '{ if($3>0 && $3<1000){i++}} END {print i}' /etc/passwd 统计普通用户数量 # awk -F: '{ if($3>1000){i++}} END {print i}' /etc/passwd
2.双分支
if...else 语句格式: {if(表达式){语句;语句;... }else{语句;语句;...}} # awk -F: '{if($3==0){print $1} else {print $7}}' /etc/passwd # awk -F: '{if($3==0) {count++} else{i++} }' /etc/passwd # awk -F: '{if($3==0){count++} else{i++}} END{print " 管理员个数: "count ; print " 系统用户数: "i}' /etc/passwd
3、多分支
if...else if...else 语句格式: # awk -F: '{ if($3==0){i++} else if($3>0 && $3<1000){j++} else if($3>1000) {k++}} END {print i;print j;print k}' /etc/passwd
# awk -F: '{ if($3==0){i++} else if($3>0 && $3<500){j++} else if($3>=500) {k++}} END {print "管理员",i;print "系统用户",j;print "普通用户",k }' /etc/passwd
Awk循环语句
1.while循环 # awk 'BEGIN{ i=1; while(i<=10){print i; i++} }'
# awk -F: '{i=1; while(i<=NF){print $i; i++}}' /etc/passwd
# awk -F: '{i=1; while(i<=10) {print $0; i++}}' /etc/passwd
2.for循环 C 风格 for # awk 'BEGIN{for(i=1;i<=5;i++){print i} }' 将每行打印 10 次 # awk -F: '{ for(i=1;i<=10;i++) {print $0} }' passwd
# awk -F: '{ for(i=1;i<=NF;i++) {print $i} }' passwd
2、sed流编辑器
sed 工作流程
【sed循环的工作过程】: 1. 读取输入流的一行到模式空间 2. 对模式空间中的内容进行匹配和处理 3. 自动输出模式空间内容 4. 清空模式空间内容 5. 读取输入流的下一行到模式空间
sed -ri.bak
sed -ric --follow-symlinks
sed 常用选项
-n:取消默认输出,只显示处理的行-e:执行多个sed指令-f:执行sed文件
-i:直接对内容进行修改-r:支持正则匹配
sed 命令
a:追加行,多行用"\" i:插入行,多行用"\" c:更改行,多行用"\" d:删除 p:打印,一般和-n一起用 n:下一行 r:读取文件 w:写入文件 !:取反 s:替换 =:行号 l:列出特殊字符 q:退出sed ================暂存缓冲区================ h:把模式空间里的内容复制到暂存缓冲区(覆盖) H:把模式空间里的内容追加到暂存缓冲区 g:取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容 G:取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面 x:交换暂存缓冲区与模式空间的内容 ====================s替换==================== s 替换标志 g 全局替换 i 忽略大小写 r 从文件中读 w 将行写入文件 y 将字符转换为另一字符(不支持正则表达式)
实例1
1.追加命令【a】 # sed '3ahello' test_passwd #3行追加 hello # sed '/lp/ahello' test_passwd #匹配行追加 hello # sed '$ahello' test_passwd #最后一行追加 hello 2.插入命令【i】 # sed '3ihello' test_passwd #3行前插入hello # sed '/root/ihello' test_passwd #匹配行前追加 hello # sed '$ihello' test_passwd #最后一行前插入hello 3.修改命令【c】 # sed '3chello' test_passwd #3行修改hello # sed '/root/chello' test_passwd #匹配行修改 hello # sed '$chello' test_passwd #最后一行修改hello 4.删除命令【d】 # sed '4d' test_passwd #删除第4行 # sed '1~2d' test_passwd #第1行开始删除,每隔2行就删一行,即删除奇数行 # sed '1,2d' test_passwd #删除第1~2行 # sed '1,2!d' test_passwd #删除1~2之外的所有行 # sed '$d' test_passwd #删除最后1行 # sed '/root/d' test_passwd #删除包含root的行 # sed '/lp/,$d' test_passwd #删除从包含lp的行到最后1行 # sed '/lp/,+1d' test_passwd #删除匹配lp的行及其后面一行 # sed '/^$/d' test_passwd #删除空行 # sed -r '/root|halt/d' test_passwd #删除匹配root或halt的行 # sed -r '/root|halt/!d' test_passwd #删除不匹配root或halt的行 # sed '1,3{/^bin/d}' test_passwd #删除1~3行中,以bin开头的行 # sed '1~2d' /etc/passwd #删除所有奇数行 # sed '0~2d' /etc/passwd #删除所有偶数行 5.打印命令【p】 # sed '' test_passwd #默认是打印输出 # sed -n '1,3p' test_passwd #打印第1-3行
# sed -n '3,5!p' test_passwd #打印3~5行,以外的内容
# sed -n '1~2p' test_passwd #打印奇数行,1行起,每隔两行
# sed -ns '$p' test_passwd a.txt #打印最后一行,多个文件用-s选项
# sed -n '3,+4p' test_passwd #打印3行到后面的4行
# sed -n '3,~4p' test_passwd #打印3行到4的倍数行 6.获取下一行命令【n】 # sed -n '/lp/{n;p}' test_passwd #打印匹配行的下一行 # sed '/lp/{n;d}' test_passwd #删除匹配行的下一行 # sed -n '/rw/{n;s/a/b/;p}' test_passwd #匹配行的下一行a替换成b 7.读文件命令【r】 # sed '3r /etc/hosts' test_passwd #从文件/etc/hosts读取内容,追加到第3行 # sed '/abc/r /etc/hosts' test_passwd #从文件/etc/hosts读取内容,追加到匹配行 8.写文件命令【w】 # sed -n '5,$w /etc/hosts' test_passwd #5到最后一行,写入到/etc/hosts(覆盖方式) # sed -n '5w,$w /etc/hosts' test_passwd #5和最后一行,写入到/etc/hosts(覆盖方式) 9.替换命令【s】 # sed 's/root/mike/' test_passwd #替换一个 # sed 's/root/mike/g' test_passwd #全部替换 # sed 's/ROOT/mike/gi' test_passwd #不区分大小写 # sed 's/root/abc/gw 1.txt' test_passwd #替换并写入到文件 # sed -r 's/(.*)/&YYY/' test_passwd #每行末尾添加YYY # sed 's/[0-9]/(&)/g' test_passwd #每行的数字加小括号 # sed -r 's/([0-9])/(\1)/g' test_passwd #每行的数字加小括号 10.打印行号【=】 # sed -n "=" test_passwd #打印行号 # sed -n "$=" test_passwd #最后一行的行号 # sed -n "/root/=" test_passwd #匹配行的行号 # sed -n "/root/{=;p}" test_passwd #匹配行的行号及内容 11.退出命令【q】 # sed "/^bin/q" test_passwd #遇到以bin开头的行,退出sed 12.列出非打印字符【l】 # sed -n "/root/l" test_passwd #列出特殊字符
sed 暂存空间与模式空间(暂存空间默认有一行换行符)
sed的数据 模式空间(文件行的内容) 保持空间(默认是换行符) # sed 'g' test_passwd #把保持空间换行符覆盖到模式空间,每行都是换行符 # sed 'G' test_passwd #把保持空间换行符追加到模式空间,数据+换行符 # sed 'h;g' test_passwd #把模式空间的内容覆盖到保持空间,再把保持空间覆盖到模式空间,数据没有变化 # sed 'h;G' test_passwd #把模式空间的内容覆盖到保持空间,再把保持空间追加到模式空间,2倍数据 # sed 'H;g' test_passwd #把模式空间的内容追加到保持空间,再把保持空间覆盖到模式空间,以行为单位,换行符+1行,换行符+2行(覆盖) # sed 'H;G' test_passwd #把模式空间的内容追加到保持空间,再把保持空间追加到模式空间,以行为单位,换行符+1行,换行符+2行(追加到每行后面) # sed '1h;$G' /etc/hosts #把1行追加最后1行 # sed '1{h;d};$G' /etc/hosts #把1行追加最后1行并删除 # sed '1h; 2,$g' /etc/hosts #把1行追加最后2行到最后一行 # sed '1h; 2,3H; $G' /etc/hosts #把1行,2到3行,追加最后一行 # sed '1h; 2x; $G' test_passwd #把1行复制,2行交换数据,保持空间追加最后一行
# sed '1x;$g' #把1行交换,保持空间追加最后一行
# sed '1!G; $!h; $!d' #不是1行的追加,不是最后一行的覆盖,不是最后一行的删除
实例2
1.反向选择【!】 # sed '3d' test_passwd #删除第3行 # sed '3!d' test_passwd #只留第3行 2.多重编辑【; {}】 # sed -e '1,3d' -e 's/root/tom/' test.txt # sed '1,3d; s/root/tom/' test.txt #先删除1到3行,然后替换 # sed '2s/abc/123/g; 2s/tom/root/g' test.txt #多个替换 # sed '2{s/abc/123/g; s/tom/root/g}' test.txt 3.使用外部变量 # sed "3a$abc" /etc/hosts #3行追加变量的值 # sed '$a'"$abc" /etc/hosts #最后一行追加变量的值 # sed 3a$abc /etc/hosts # sed "\$a$abc" /etc/hosts #$要转义
QQ:328864113 微信:wuhg2008