Sed-Awk
sed
SED命令流程
1、把命令一条一条读到内存(模式空间)中
2、判断是否是我要的这一行,是否满足条件,是执行3;否执行1
3、执行sed里的命令
4、sed命令会默认显示、输出当前内存中的内容,默认输出 ----->显示到屏幕
5、继续读取下一行,直到读取到文件的最后一行
增
a(append) i (insert)
sed -i '3a 103.5,xx' 123.txt # 在第三行后面追加一行,-i修改源文件
sed -i '3i 103.5,xx' 123.txt # 在第三行前面追加一行,-i修改源文件
sed -i '$a xxxx' 123.txt # 在最后一行追加一行;当xxxx包含\n是追加多行
cat >> 123.txt<<EOF XX XX XX EOF
删
sed -i '$d' 123.txt # 删除最后一行
sed -i '2,3d' 123.txt # 删除2、3行
删除空行:
grep -v '^$' 123.txt
sed '/^&/p' 123.txt # 显示空行
sed '/^$/!p' 123.txt # 不显示空行, !取反,在awk,sed中有效
改
sed -i.ori 's#需要替换的内容#替换成什么#g' 123.txt # s表示替换,g表示全局(全行), -i加尾巴,表示先备份,再修改原文件
a = xxx
b = assd
sed 's#$a#$b#g' 123.txt 会把'$a' 变成$b ‘’所见即所得
sed "s#$a#$b#g" 123.txt 会将变量代表的值进行替换 “”里面的特殊符号会被解析 $ $() ! ``
# 以下两种写法一致 [root@ace data]# ifconfig eth0|sed -n '2p'|sed 's#inet#oldboy#g' [root@ace data]# ifconfig eth0|sed -n '2s#inet#oldboy#gp'
查
p(print) 打印模式空间的内容 sed -n '20p' 123.txt # 显示第20行,-n关闭默认输出,不关闭的话,再输出内容后,会打印全文
sed -n '20,30p' 123.txt # 显示第20到第30行
sed -n '20;30p' 123.txt # 显示第20和第30行
sed -n '20,$p' 123.txt # 显示第20到最后一行,$p最后一行
sed -n '/oldboy/p' 123.txt # 显示匹配到包含oldboy的行
sed -n '/oldboy/,/^104/p' 123.txt # 显示匹配到包含oldboy的行,直到以104开头的行
sed -rn '/yy|oldboy/p' # 显示包含yy或oldbody的行(正则、egrep)
awk
awk执行过程
1、读入命令
2、模式(条件)是我要处理的行?
3、对读入行执行动作(action)里命令
4、重复上面过程直到最后一个文件结尾
awk 参数 ‘模式{动作}’ 文件
[root@ace data]# awk '/zhangsan/' 123.txt # 匹配zhangsan
[root@ace data]# awk '!/zhangsan/' 123.txt # 不匹配zhangsan
[root@ace data]# awk 'NR==20' 123.txt # 显示第20行
[root@ace data]# awk 'NR==20,NR==30' 123.txt # 显示第20到第30行
[root@ace oldboy]# awk -F "[, ]" '{print $3,"原封不动的输出"$6}' oldboy.txt
-F "[, ]" 表示以逗号或者空格作为菜刀 分隔符
ifconfig eth0|awk 'NR==2{print $2}'
ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'
awk
awk '$2~/Xiaoyu/{print $1,$2,$3}' # 匹配第二列中包含Xiaoyu并打印第1,2,3列 ;~表示包含; $0表示整行
awk '$3~/^41/' 123.txt # 第三列中以41开头的
awk '$3~/[15]$/' 123.txt # 第三列以1或者5结尾的行
awk '$3~/(1|5)$/' 123.txt
awk '{gsub(/:/,"$",$4);print}' 123.txt # 将第四列的:变成$ 默认没有输出,需要用print
$NF 最后一列
awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print}' # gsub函数。。。
取出某一列、行 ,统计
模式匹配:模式与动作
通过正则表达式作为模式
特殊模式BEGIN和END
awk数组-统计与计算
awk '!/^$/' 123.txt
特殊模式BEGIN和END
awk 'GEBIN{print "this is kt"}' {print NR,50} 123.txt # begin里的内容会先执行, NR行号
awk '/^&/{i=i+1;print i }' 123.txt
i++
awk '/^&/{i=i+1}END{print i}' 123.txt # 先计算,再显示结果
awk数组
awk 'BEGIN{h[110]="lee";h[114]="x1";print h[110],h[114] '
awk -F "[/.]+" "{h[$2]++}END{print h['www'],h['post']}" 123.txt
awk -F "[/.]+" "{h[$2]++}END{for(pol in h) print pol,h[pol]}" 123.txt

浙公网安备 33010602011771号