awk与sed常用实例总结

发布时间:2019-10-18编辑:脚本学堂
linux awk命令与sed命令的例子,包括文本间隔、空行删除、文本替换等,通过实例掌握sed命令、awk命令的用法。

一、文本间隔
1、在每一行后面增加一空行
 

sed G guo.sh
linuxjishu/13830.html target=_blank class=infotextkey>awk '{printf("%snn",$0 ) }'

2、将文件中原来的空行删掉,并在在每一行后边增加一空行
 

sed '/^$/d;G '
awk '!/^$/ {printf("%snn",$0 ) }'

3、在匹配式样的行前插入一空行
 

复制代码 代码示例:
sed '/good/i'
sed '/hello/{x;p;x;}'
awk '{ if(/hello/) printf("n%sn",$0);else print $0}'

4、在匹配式样的行后插入一空行
 

复制代码 代码示例:
sed '/good/a'
sed '/hello/G'
awk '{if(/hello/) printf("%snn",$0) ;else print $0}'

5、在匹配式样的行前、行后各插入一空行
 

复制代码 代码示例:
sed '/hello/{x;p;x;G;}'
awk '{ if(/hello/) printf("n%snn",$0);else print $0}'

二、文本替换
1、在每一行查找到good,然后把good替换为bad
 

sed 's/good/bad/'只把每行的第一个good替换为bad
sed 's/good/bad/2'只把每行的第二个good替换为bad
sed 's/good/bad/g'把每一行的所有good替换为bad
sed 's/(.*)good/1bad/'只把每一行的的最后一个good替换位bad
sed 's/(.*)good(.*good)/1bad2/'只把每一行的的倒数第二个good替换位bad
awk   '{sub(/good/,"bad"); print $0}'只把每行的第一个good替换为bad
awk   '{gsub(/good/,"bad"); print $0}'把每一行的所有good替换为bad
cat  test |tr 'root' 'good'
cat  test |tr 'root' 'god'------注意区别
sed   's/root/good/p' test
awk   '{gsub(/root/,"good");print $0}' test
awk   '{gsub(/root/,"god");print $0}' test
 

通过对比可知tr的替换两个字串必须等长度,而sed不能把说有的root替换

2、只在出现字符串fell字符串的前提下,将找到的行中的good替换为bad
 

sed  '/fell/ s/good/bad/g'
awk   '{if(/fell/) gsub(/good/,"bad"); print $0 }'

3、只在不出现字符串fell字符串的前提下,将找到的行中的good替换为bad
 

sed '/fell/ !s/good/bad/g'
awk '{if(!/fell/) gsub(/good/,"bad"); print $0 }'

4、多单词替换,替换为一个单词
 

sed 's/good/bad/g;s/fell/bad/g;s/sun/bad/g'
sed 's/good|fell|sun/bad/g'
awk '{gsub(/good|fell|sun/,"bad") ; print $0}'

5、倒置所有行,第一行变为最后一行(模拟tac)
 

sed '1!G;h;$!d'
sed -n '1!G;h;$p'
awk '{A[i++]=$0} END{for (j=i-1;j>=0;j--) print A[j]}'

6、将每两行连接为一行
 

sed '$!N;s/n/ /'
awk '{f=!f;if(!f) printf("%s",$0);else printf("%sn",$0)}'

7、在文件中每隔5行显示一空行
 

sed '0~5G'
sed 'n;n;n;n;G'
awk '{print $0 ;i++;if(i==5) {printf( "n") ;i=0}}'

三、选择性的显示特定行
1、显示文件的前10行
 

sed 10q
awk '{print ;if(NR==10) exit }'

2、显示文件的第一行
 

sed q
awk '{ print;exit}'

3、显示文件的倒数第二行
 

sed -e '$!{h;d;}' -e x当文件只有一行时,输出空行
sed -e '1{$q;}' -e '$!{h;d;}' -e x当文件只有一行时,显示该行
sed -e '1{$d;}' -e '$!{h;d;}' -e x当文件只有一行时,不输出
awk '{ B=A;A=$0} END{ print B}'当文件只有一行时,输出空行

4、只显示匹配正则表达式的行
 

sed -n '/good/p'
sed  '/good/!d'
awk '/good/ {print $0}'
awk '/good/'
grep 'good'

5、只显示不匹配正则表达式的行
 

sed -n '/good/!p'
sed '/good/d'
awk '!/good/ {print $0}'
grep -v 'good'

6、显示匹配行的上一行,而不显示匹配行
 

sed -n '/good/{g;1!p;};h'
awk '/good/ {print A} {A=$1}

7、显示匹配行的下一行,而不显示匹配行
 

sed -n '/good/{n;p;}'
awk '{if(A) print;A=0}/23/{A=1}'

8、显示文本的制定行
 

sed -n '3,5p'
sed '3,5!d'
awk '{if(NR>=3 &&NR<=5) print } '

1、不显示文件中的空行
 

[guo@guo~]$ grep -v '^$' rc.local
[guo@guo~]$ sed -e '/^$/d' rc.local
[guo@guo~]$ awk '!/^$/{print $0 }' rc.local

2、删除文件的1到5行
 

[guo@guo~]$ cat test
[guo@guo~]$ sed -e '1,5d' test
[guo@guo~]$ awk '{if(NR>5 ) print $0} ' test

3、删除文件注释行
 

[guo@guo~]$ sed -e "/^#/d" rc.local
[guo@guo~]$ awk '!/^#/{print $0}' rc.local
[guo@guo~]$ grep -v '^#' rc.local

5、显示从字符1到字符2的中间行
 

[guo@guo~]$ sed -n -e '/hello/,/sorry/p' test1
[guo@guo~]$ awk '/hello/,/sorry/ {print $0 }' test1

6、匹配特别表达式
 

[guo@guo~]$ sed -n -e '/main[[:space:]]*(/,/^}/p' for.c

1、通过awk访问系统环境变量
 

[guo@guoawk]$ awk 'BEGIN { print ENVIRON["HOME"]; printENVIRON["PATH"]}'
/home/guo
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin

2、awk中的算术运算符
 

[guo@guoawk]$ awk 'BEGIN {print "3+2=" 3+2 }'
3+2=5
[guo@guoawk]$ awk 'BEGIN {print "2^10=" 2^10 }'
2^10=1024
[guo@guoawk]$ awk 'BEGIN {print "(3+1)*4/2=" (3+1)*4/2}'
(3+1)*4/2=8
 

awk支持的运算符有+ - * / % ^。

4、awk的循环
if语句
 

[guo@guoawk]$ cat num
12243535
890232
232 9809
890 -8990
[guo@guoawk]$ awk '{if($1>$2) print $0}' num
890232
890 -8990
[guo@guoawk]$ awk '{if($1>$2) {print $0 ; print $1 "is larger than"$2}}' num
890232
890islarger than232
890 -8990
890islarger than-8990
if/else
[guo@guoawk]$ awk '{if($1>$2) print $1 ;else print $2}' num
3535
890
9809
890
[guo@guoawk]$ awk '{if($1>$2) {count++ ;print count} else print $2}' num
3535
1
9809
2

如何用sed打印文件范围从第二行至倒数第二行?

普通青年版:
 

sed '1d;$d'
文艺青年版:
sed -n '1!P;N;$q;D'
二逼青年版:
sed -r ':a;N;$!ba;s/^[^n]+n(.+)n[^n]+$/1/'

awk的一些常见使用
1、求和
 

cat data|awk '{sum+=$1} END {print "Sum = ", sum}'
 

 
2、求平均
 

cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'

3、求最大值
 

cat data|awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1 fi} END {print "Max=", max}'

4、求最小值(min的初始值设置一个超大数即可)
 

awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'

5、求访问次数的Top 10 Resource,可以根据此进行优化
 

cat output/logs/cookie_logs/`date +%u`/cookie_log|grep -v '172.16'|grep -v '127.0.0.1' |awk -F' '  '{ if(index($1,"219.141.246")!=0) print $2; else print $1  } '|sort|uniq -c|sort -n |tail -n 10