sed和awk的常用實例

一、文本間隔

    1、在每一行後面增加一空行

sed G guo.sh

awk '{printf("%s\n\n",$0 ) }'

     2、將文件中原來的空行刪掉,並在在每一行後邊增加一空行

sed '/^$/d;G '

awk '!/^$/ {printf("%s\n\n",$0 ) }'

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

sed '/good/i\\'

sed '/hello/{x;p;x;}'

awk '{ if(/hello/) printf("\n\%s\n",$0);else print $0}'

     4、在匹配式樣的行後插入一空行

sed '/good/a\\'

sed '/hello/G'

awk '{if(/hello/) printf("%s\n\n",$0) ;else print $0}'

     5、在匹配式樣的行前、行後各插入一空行

sed '/hello/{x;p;x;G;}'

awk '{ if(/hello/) printf("\n\%s\n\n",$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\)/\1bad\2/'只把每一行的的倒數第二個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("%s\n",$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、不顯示文件中的空行 2、刪除文件的1到5行3、刪除文件註釋行4、打印匹配行5、顯示從字符1到字符2的中間行6、匹配特別表達式7、替代文本

 

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

 

 

2012年10月9日 14:50:38

 

如何用sed打印文件範圍從第二行至倒數第二行?   轉自:http://bbs.chinaunix.net/thread-3700991-1-1.html



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

 

 

2014年3月21日 00:15:06

 

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

將打印除第一列之外的所有內容:

awk '{$1=""; print $0}' somefile
將打印除兩列外的所有列:

awk '{$1=$2=""; print $0}' somefile
 

發佈了98 篇原創文章 · 獲贊 69 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章