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拓展

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

[[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拓展

  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的联系及拓展的主要内容,如果未能解决你的问题,请参考以下文章

Linux(三十)三剑客整理及小工具拓展

Sed&awk笔记之awk

Linux的文本编辑diff & sed & awk & grep

linux awk命令详解

Linux学习笔记7_基本命令复习2(seq sed awk)

[Linux Shell学习系列十四]sed和awk-5.awk基础