linux笔记(28)sed和awk的联系及拓展
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux笔记(28)sed和awk的联系及拓展相关的知识,希望对你有一定的参考价值。
sed练习题
把/etc/passwd 复制到/root/test.txt,用sed打印所有行
[[email protected] sed]# sed -n '1,$p' passwd
打印test.txt的3到10行
[[email protected] sed]# sed -n '3,10'p passwd
打印test.txt 中包含 ‘root’ 的行
[[email protected] sed]# sed -n '/root/'p passwd
删除test.txt 的15行以及以后所有行
[[email protected] sed]# sed '15,$'d passwd
删除test.txt中包含 ‘bash’ 的行
[[email protected] sed]# sed '/bash/'d passwd
替换test.txt 中 ‘root’ 为 ‘toor’
[[email protected] sed]# sed 's/root/toor/g' passwd
替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’
[[email protected] sed]# sed 's#sbin/nologin#bin/login#g' passwd
删除test.txt中5到10行中所有的数字
[[email protected] sed]# sed '5,10s/[0-9]//g' passwd
删除test.txt 中所有特殊字符(除了数字以及大小写字母)
[[email protected] sed]# sed 's/[^a-zA-Z0-9]//g' passwd
把test.txt中第一个单词和最后一个单词调换位置
[email protected] 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中出现的第一个数字和最后一个单词替换位置
[[email protected] 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 中第一个数字移动到行末尾
[[email protected] sed]# sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd
在test.txt 20行到末行最前面加 ‘aaa:’
[[email protected] sed]# sed '20,$s/^.*$/aaa:&/' passwd
sed拓展
如何截取文件中特定的某到某行
[[email protected] sed]# cat test.txt
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf
如何截取[abcfd]到[rty]这一段呢?
答案:[[email protected] sed]# sed -n '/\[abcfd\]/,/\[rty\]/p' test.txt
2.sed如何转换大小写字母
(1)把所有的小写变大写
[[email protected] sed]# sed 's/[a-z]/\u&/g' test.txt
(2)把所有的大写变小写
[[email protected] sed]# sed 's/[a-z]/\l&/g' test.txt
(3)把每个单词的第一个小写字母变大写
[[email protected] sed]# sed 's/\b[a-z]/\u&/g' test.txt
3.sed在文件某一行最后一个数字
[[email protected] sed]# cat test.txt
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf
[[email protected] sed]# sed 's/\(^[0-9].*\)/\1 12/' test.txt
4.如何使用sed打印1到100行包含某个字符串的行
[[email protected] sed]# cat test.txt
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf
答案:[[email protected] sed]# sed -n '1,100{/fd/p}' test.txt
fff
[abcfd]
fgfgf
支持多字符:
[[email protected] sed]# sed -n '1,100{/ert/p;/1./p}' test.txt
ert
123
5.sed删除某关键字的下一行到最后一行
awk练习题
用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
[[email protected] sed]# awk '{print $0}' passwd
查找所有包含 ‘bash’ 的行
[[email protected] sed]# awk '/bash/' passwd
用 ‘:’ 作为分隔符,查找第三段等于0的行
[[email protected] sed]# awk -F ':' '$3==0' passwd
用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)
[[email protected] sed]# awk -F ':' '$1==root' |sed 's/root/toor/g' passwd
用 ‘:’ 作为分隔符,打印最后一段
[[email protected] sed]# awk -F ':' '{print $NF}' passwd
打印行数大于20的所有行
[[email protected] sed]# awk 'NR>20' passwd
用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行
[[email protected] sed]# awk -F ':' '$3<$4' passwd
用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 '[email protected]/bin/bash‘ )
[[email protected] sed]# awk -F ':' {'print $1"@"$NF}' passwd
用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
[[email protected] sed]# awk -F ':' '{(tot=tot+$4)}; END {print tot}' passwd
把/etc/passwd 复制到/root/test.txt,用sed打印所有行
[[email protected] sed]# sed -n '1,$p' passwd
打印test.txt的3到10行
[[email protected] sed]# sed -n '3,10'p passwd
打印test.txt 中包含 ‘root’ 的行
[[email protected] sed]# sed -n '/root/'p passwd
删除test.txt 的15行以及以后所有行
[[email protected] sed]# sed '15,$'d passwd
删除test.txt中包含 ‘bash’ 的行
[[email protected] sed]# sed '/bash/'d passwd
替换test.txt 中 ‘root’ 为 ‘toor’
[[email protected] sed]# sed 's/root/toor/g' passwd
替换test.txt中 ‘/sbin/nologin’ 为 ‘/bin/login’
[[email protected] sed]# sed 's#sbin/nologin#bin/login#g' passwd
删除test.txt中5到10行中所有的数字
[[email protected] sed]# sed '5,10s/[0-9]//g' passwd
删除test.txt 中所有特殊字符(除了数字以及大小写字母)
[[email protected] sed]# sed 's/[^a-zA-Z0-9]//g' passwd
把test.txt中第一个单词和最后一个单词调换位置
[email protected] 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中出现的第一个数字和最后一个单词替换位置
[[email protected] 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 中第一个数字移动到行末尾
[[email protected] sed]# sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd
在test.txt 20行到末行最前面加 ‘aaa:’
[[email protected] sed]# sed '20,$s/^.*$/aaa:&/' passwd
用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
[[email protected] sed]# awk '{print $0}' passwd
查找所有包含 ‘bash’ 的行
[[email protected] sed]# awk '/bash/' passwd
用 ‘:’ 作为分隔符,查找第三段等于0的行
[[email protected] sed]# awk -F ':' '$3==0' passwd
用 ‘:’ 作为分隔符,查找第一段为 ‘root’ 的行,并把该段的 ‘root’ 换成 ‘toor’ (可以连同sed一起使用)
[[email protected] sed]# awk -F ':' '$1==root' |sed 's/root/toor/g' passwd
用 ‘:’ 作为分隔符,打印最后一段
[[email protected] sed]# awk -F ':' '{print $NF}' passwd
打印行数大于20的所有行
[[email protected] sed]# awk 'NR>20' passwd
用 ‘:’ 作为分隔符,打印所有第三段小于第四段的行
[[email protected] sed]# awk -F ':' '$3<$4' passwd
用 ‘:’ 作为分隔符,打印第一段以及最后一段,并且中间用 ‘@’ 连接 (例如,第一行应该是这样的形式 '[email protected]/bin/bash‘ )
[[email protected] sed]# awk -F ':' {'print $1"@"$NF}' passwd
用 ‘:’ 作为分隔符,把整个文档的第四段相加,求和
[[email protected] sed]# awk -F ':' '{(tot=tot+$4)}; END {print tot}' passwd
awk拓展
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的联系及拓展的主要内容,如果未能解决你的问题,请参考以下文章
Linux的文本编辑diff & sed & awk & grep