• sed和awk的常用实例


    一、文本间隔

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

    sed G guo.sh

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

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

    sed '/^$/d;G '

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

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

    sed '/good/i\'

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

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

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

    sed '/good/a\'

    sed '/hello/G'

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

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

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

    awk '{ if(/hello/) printf(" \%s ",$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、不管是good、fell还是sun,一路替换为bad

    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/ / /'

    awk '{f=!f;if(!f) printf("%s",$0);else printf("%s ",$0)}'

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

    sed '0~5G'

    sed 'n;n;n;n;G'

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

    三、选择性的显示特定行

    1、显示文件的前10行

    sed10q

    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/^[^ ]+ (.+) [^ ]+$/1/'
  • 相关阅读:
    Metasploit学习笔记——强大的Meterpreter
    Metasploit学习笔记——社会工程学
    Mono for Andriod学习与实践(1)— 初体验
    Xamarin.Android 在VS下调试时提示 In mgmain JNI_OnLoad 程序“Mono”已退出 解决办法
    Xamarin.Android 使用 SQLiteOpenHelper 进行数据库操作
    WCF 部署时,soap:address location 显示的是电脑名,而不是ip地址
    英特尔® 硬件加速执行管理器安装指南 — Microsoft Windows*
    使用Intel HAXM 加速你的Android模拟器
    Xamarin Studio Android 配置
    Xamarin C# Android for Visual Studio 平台安装
  • 原文地址:https://www.cnblogs.com/seasonzone/p/3465545.html
Copyright © 2020-2023  润新知