三剑客(一)

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'[ : ]' '{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 " 用户uid: " $3 " 用户gid:" $4}' /etc/passwd printf 函数 # awk -F: '{printf "%-15s %-10s %-15s ", $1, $2, $3}' /etc/passwd %s 字符类型 %d 数值类型 占 15 字符 - 表示左对齐,默认是右对齐 printf 默认不会在行尾自动换行,加

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                          #$要转义

                    

                  

原文地址:https://www.cnblogs.com/wuhg/p/13427136.html