awk&sed(一)

awk:

  awk是一种用于处理文本的编程语言工具。

  该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。

  awk程序由一系列模式-动作组成,写为:

    pattern { action }

  其中pattern是表示awk在数据中查找的内容,而action是在找到匹配内容时,所执行的一系列命令。无pattern,默认匹配所有的记录;无action,默认打印所有的记录。

   

sed -i 's/'"'"/"\\\'"'/g' media_list.txt
awk -F'\t' "{ if(\$3~/hot-movie/) type=\"movie\";else if(\$3~/hot-tv/) type=\"tv\";else type=\$3;printf \"insert into fs_media(media_id,media_name,type,creator,create_time) value(%d,'%s','%s','%s','%s');\\n\",\$1,\$2,type,\$6,\$5}" ./media_list.txt > media.sql
  • awk命令学习:
      • #上面的命令也等价于:(-F的意思就是指定分隔符)
        $ awk -F: '{print $1,$3,$6}' /etc/passwd
        
        #找出匹配“test.funshion.com”的行
        awk /test.funshion.com/ netstat.txt
        
        #找出匹配的行,并且用空格分隔$1,$4:{上面的第一个示例匹配FIN状态, 第二个示例匹配WAIT字样的状态。其实 ~ 表示模式开始。/ /中是模式。这就是一个正则表达式的匹配。}
        awk '/test.funshion.com/ {print NR,$1,$4}' OFS="\t" netstat.txt
        
        #模式取反,等价于:awk '!/WAIT/' netstat.txt
        awk '4 !~ /test/ || NR==1 {print NR,4 !~ /test/ || NR==1 {print NR,4,$5}' OFS="\t" netstat.txt 
        
        #计算文件的总和大小
        ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'
        
        #计算每个用户占用的内存的多少
        ps aux | awk 'NR!=1{a[1]+=1]+=6;} END { for(i in a) print i ", " a[i]"KB";}'
        
        #在上面我们可以看到一个END关键字。END的意思是“处理完所有的行的标识”
        #:找出文本中长度大于80的行
        awk 'length>80' netstat.txt 
        
        #NR是加上表头的意思

sed:

  sed是stream editor的缩写,是unix常用的命令。sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出。sed通常用来匹配一个或多个正则表达式的文本进行处理。

 

  • sed命令的学习
    • #把其中的my字符串替换成Hao Chen’s,下面的语句应该很好理解(s表示替换命令,/my/表示匹配my,/Hao Chen’s/表示把匹配替换成Hao Chen’s,/g 表示一行上的替换所有的匹配):  
      $ sed "s/my/Hao Chen's/g" pets.txt   
      
      #或使用 -i 参数直接修改文件内容: 
      $ sed -i "s/my/Hao Chen's/g" pets.txt  
      
      #作用:删除html中的标签,其中:[^>]* 表示:除去>外的字符重复o次或者多次
      $ sed 's/<[^>]*>//g' html.txt  
      
      # :只替换第三行到第六行的
      sed "3,6s/my/your/g" pets.txt
      
      #:只替换每行的第二个s
      sed 's/s/S/2' my.txt 
      
      #:只替换每行第三个和以后的s
      sed 's/s/S/3g' my.txt 
      
      #:双模式  <==>sed -e 
      sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt
      
      # :我们可以使用&来当做被匹配的变量,然后可以在基本左右加点东西
      sed 's/my/[&]/g' my.txt
      
      #圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,sed中使用的是\1,\2…):
      sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' cat.txt
      
      #先来看N命令 —— 把下一行的内容纳入当成缓冲区做匹配。
      #:匹配奇数行,只进行一次匹配,额外的例子:sed 'N;s/\n/,/' pets.txt 
      sed 'N;s/my/your/' cat.txt #正则表达式的基本知识a命令和i命令 ;a命令就是append, i命令就是insert,它们是用来添加行的 :其中的1i表明,其要在第1行前插入一行(insert) 
      sed "1 i This is my monkey, my monkey's name" cat.txt 
      
      #c命令是替换://替换第二行的内容; 
      sed "2 c This is my monkey, my monkey's name is wukong" my.txt sed "/fish/c This is my monkey, my monkey's name is wukong" my.txt 
      
      #d命令删除匹配行: 
      #:删除第二行; 
      sed "2d" cat.txt 
      
      #:删除第二行及其以后的行; 
      sed "2,d" cat.txt 
      
      #:删除匹配fish的行 
      sed "/fish/d" cat.txt 
      
      #p是打印命令,使用给这个命令会让匹配行被打印两次
  • 正则表达式的基本命令
    • ^ 表示一行的开头。如:/^#/ 以#开头的匹配。
    • $ 表示一行的结尾。如:/}$/ 以}结尾的匹配。
    • \< 表示词首。 如 \<abc 表示以 abc 为首的詞。
    • \> 表示词尾。 如 abc\> 表示以 abc 結尾的詞。
    • . 表示任何单个字符。
    • * 表示某个字符出现了0次或多次。
    • [ ] 字符集合。 如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示反,如[^a]表示非a的字符 
posted @ 2017-04-19 20:16  玛吉  阅读(257)  评论(0)    收藏  举报