码迷,mamicode.com
首页 > 系统相关 > 详细

linux笔记(28)sed和awk的联系及拓展

时间:2017-11-25 19:23:39      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:28

sed练习题

把/etc/passwd 复制到/root/test.txt,用sed打印所有行

[root@localhost sed]# sed -n '1,$p' passwd


打印test.txt的3到10行

[root@localhost sed]# sed -n '3,10'p passwd 


打印test.txt 中包含 ‘root’ 的行

[root@localhost sed]# sed -n '/root/'p passwd 


删除test.txt 的15行以及以后所有行

[root@localhost sed]# sed '15,$'d passwd


删除test.txt中包含 ‘bash’ 的行

[root@localhost sed]# sed '/bash/'d passwd 


替换test.txt 中 ‘root’ 为 ‘toor’

[root@localhost sed]# sed 's/root/toor/g' passwd


替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’

[root@localhost sed]# sed 's#sbin/nologin#bin/login#g' passwd 


删除test.txt中5到10行中所有的数字

[root@localhost sed]# sed '5,10s/[0-9]//g' passwd 


删除test.txt 中所有特殊字符(除了数字以及大小写字母)

[root@localhost sed]# sed 's/[^a-zA-Z0-9]//g' passwd 


把test.txt中第一个单词和最后一个单词调换位置

root@localhost sed]# sed 's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/' passwd bash:x:0:0:root:/root:/bin/root-zA-Z]*$\)/\4\2\3\1/' passwd 


把test.txt中出现的第一个数字和最后一个单词替换位置

[root@localhost sed]#  sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' passwd 


把test.txt 中第一个数字移动到行末尾

[root@localhost sed]#  sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd


在test.txt 20行到末行最前面加 ‘aaa:’

[root@localhost sed]# sed '20,$s/^.*$/aaa:&/' passwd 


sed拓展

  1. 如何截取文件中特定的某到某行

[root@localhost sed]# cat test.txt 

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

如何截取[abcfd]到[rty]这一段呢?

答案:[root@localhost sed]# sed -n '/\[abcfd\]/,/\[rty\]/p' test.txt


2.sed如何转换大小写字母

(1)把所有的小写变大写

[root@localhost sed]# sed 's/[a-z]/\u&/g' test.txt 

(2)把所有的大写变小写

[root@localhost sed]# sed 's/[a-z]/\l&/g' test.txt

(3)把每个单词的第一个小写字母变大写

[root@localhost sed]# sed 's/\b[a-z]/\u&/g' test.txt  


3.sed在文件某一行最后一个数字

[root@localhost sed]# cat test.txt 

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

[root@localhost sed]# sed 's/\(^[0-9].*\)/\1 12/' test.txt 


4.如何使用sed打印1到100行包含某个字符串的行

[root@localhost sed]# cat test.txt 

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

答案:[root@localhost sed]# sed -n '1,100{/fd/p}' test.txt

fff

[abcfd]

fgfgf

支持多字符:

[root@localhost sed]# sed -n '1,100{/ert/p;/1./p}' test.txt 

ert

123


5.sed删除某关键字的下一行到最后一行


awk练习题

用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)

[root@localhost sed]# awk '{print $0}' passwd 


查找所有包含 ‘bash’ 的行

[root@localhost sed]# awk '/bash/' passwd


用 ‘:’ 作为分隔符,查找第三段等于0的行

[root@localhost sed]# awk -F ':' '$3==0' passwd


用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)

[root@localhost sed]# awk -F ':' '$1==root' |sed 's/root/toor/g' passwd 


用 ‘:’ 作为分隔符,打印最后一段

[root@localhost sed]# awk -F ':' '{print $NF}' passwd 


打印行数大于20的所有行

[root@localhost sed]# awk  'NR>20' passwd


用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行

[root@localhost sed]# awk -F ':' '$3<$4' passwd


用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 'root@/bin/bash‘ )

[root@localhost sed]# awk -F ':'  {'print $1"@"$NF}' passwd


用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和

[root@localhost sed]# awk -F ':' '{(tot=tot+$4)}; END {print tot}' passwd 


把/etc/passwd 复制到/root/test.txt,用sed打印所有行

[root@localhost sed]# sed -n '1,$p' passwd


打印test.txt的3到10行

[root@localhost sed]# sed -n '3,10'p passwd 


打印test.txt 中包含 ‘root’ 的行

[root@localhost sed]# sed -n '/root/'p passwd 


删除test.txt 的15行以及以后所有行

[root@localhost sed]# sed '15,$'d passwd


删除test.txt中包含 ‘bash’ 的行

[root@localhost sed]# sed '/bash/'d passwd 


替换test.txt 中 ‘root’ 为 ‘toor’

[root@localhost sed]# sed 's/root/toor/g' passwd


替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’

[root@localhost sed]# sed 's#sbin/nologin#bin/login#g' passwd 


删除test.txt中5到10行中所有的数字

[root@localhost sed]# sed '5,10s/[0-9]//g' passwd 


删除test.txt 中所有特殊字符(除了数字以及大小写字母)

[root@localhost sed]# sed 's/[^a-zA-Z0-9]//g' passwd 


把test.txt中第一个单词和最后一个单词调换位置

root@localhost sed]# sed 's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/' passwd bash:x:0:0:root:/root:/bin/root-zA-Z]*$\)/\4\2\3\1/' passwd 


把test.txt中出现的第一个数字和最后一个单词替换位置

[root@localhost sed]#  sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' passwd 


把test.txt 中第一个数字移动到行末尾

[root@localhost sed]#  sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd


在test.txt 20行到末行最前面加 ‘aaa:’

[root@localhost sed]# sed '20,$s/^.*$/aaa:&/' passwd 




用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)

[root@localhost sed]# awk '{print $0}' passwd 


查找所有包含 ‘bash’ 的行

[root@localhost sed]# awk '/bash/' passwd


用 ‘:’ 作为分隔符,查找第三段等于0的行

[root@localhost sed]# awk -F ':' '$3==0' passwd


用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)

[root@localhost sed]# awk -F ':' '$1==root' |sed 's/root/toor/g' passwd 


用 ‘:’ 作为分隔符,打印最后一段

[root@localhost sed]# awk -F ':' '{print $NF}' passwd 


打印行数大于20的所有行

[root@localhost sed]# awk  'NR>20' passwd


用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行

[root@localhost sed]# awk -F ':' '$3<$4' passwd


用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 'root@/bin/bash‘ )

[root@localhost sed]# awk -F ':'  {'print $1"@"$NF}' passwd


用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和

[root@localhost sed]# awk -F ':' '{(tot=tot+$4)}; END {print tot}' passwd 


awk拓展

  1. awk中gsub函数的使用

awk 'gsub(/www/,"abc")' /etc/passwd                                    // passwd文件中把所有www替换为abc

2.把文件中相同的行合并成一行

paste  filename1  filename2

cat  a.txt
1 2 3 
4 5 6 
a b c

cat b.txt
3 2 1 
6 5 4 
c b a 

则  paste  a.txt  b.txt  结果为
1 2 3   3 2 1
4 5 6   6 5 4
a b c   c b a

如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
paste -d '+'  a.txt b.txt
结果为
1 2 3+3 2 1
4 5 6+6 5 4
a b c+c b a


awk更详细的用法:http://www.cnblogs.com/emanlee/p/3327576.html

linux笔记(28)sed和awk的联系及拓展

标签:28

原文地址:http://blog.51cto.com/13407306/2044240

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!