SED
 
1、sed是流编辑器(stream editor)缩写,作用主要是文本替换
命令格式:sed ‘s/pattern/replace_string/' file或者cat file | sed 's/pattern/replace_string/'
 
2、默认情况下sed只会打印替换后的文本,如果需要在替换的同时保存更改,可以使用-i选项,可以将替换结果应用于源文件,很多用户在进行替换后会使用重定向来保存文件:
sed  ‘s/pattern/replace_string/' file > newfile
其实只需要使用sed -i ‘s/pattern/replace_string/' file

sed 's/\b[0-9]\{3\}\b/NUMBER/g' test.txt  (匹配出文件中的三位数并全部替换成NUMBER)

3、默认情况下sed命令只会替换第一处符合模式的内容,如果需要全部替换可以在命令尾部加上参数g,使用sed ‘s/pattern/replace_string/g' file对所有匹配的内容进行替换,如果想从第n处匹配开始替换,可以是用/ng,如:sed ‘s/pattern/replace_string/2g' file
 
4、 使用sed '/pattern/d' file删除匹配样式的行,使用sed ‘/^$/d' file删除空白行

5、已匹配字符串标记(&)

echo thisi is an example | sed 's/\w\+/[&]/g'

[this] [is] [an] [example]

6、子字符串匹配(\1\)

echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'

this is 7 in a number

\n代表匹配的内容,\1代表第一个()内匹配的内容,\2代表第二个()内匹配的内容,依次类推

7、组合多个表达式
sed ‘expression’ | sed ‘ expression’

等价于

sed ‘expression ; expression’

等价于

sed -e ‘expression’ -e ‘ expression’

e.g.

echo abc | sed 's/a/A/' | sed 's/c/C/'

echo abc | sed 's/a/A/; s/c/C/'

echo abc | sed -e 's/a/A' -e 's/c/C'

的输出都为AbC

8、引用

使用变量时需要使用“”,不能使用单引号’‘

e.g.

text=hello

echo hello world | sed "/s/$text/Hello/"

Hello world
 
awk

awk是一款设计用于数据流的工具,他的关键点在于可以对列和行进行操作。awk具有很多內建功能,比如数组、函数等,这也是它和C语言的相同之处,灵活性是awk最大的优势。

1、脚本的结构基本如下:
awk ‘BEGIN{  print “start”}  pattern {  commands  }  END{  print “end” }'  file
awk也可以从stdin中读取
awk脚本通常由3部分组成。BEGIN END 和 带模式匹配选项的常见语句块。这三部分都是可选项,在脚本中可以省略任意部分
2、工作原理:
(1)执行BEGIN{  commnands  }语句块中的语句
(2)从文件或者stdin中读取一,然后执行 pattern {  commands  }。重复这个过程,知道文件全部被读取完毕
(3)当读至输入流末尾时,执行END {  commands  }语句块
最重要的部分就是pattern语句块中的通用命令,这个语句块同样是可选的,如果不提供,默认执行{  print  },即打印所读取到的每一行。awk对于每一行,都会执行这个语句块。就像一个用来读取行的while循环,在循环体中提供了相应的语句
        每读取一行,awk就会检查该行和提供的模式是否匹配,模式本身可以是正则表达式、条件语句以及行匹配范围等。如果当前行匹配为该样式,则执行{}中的语句
        模式是可选的,如果没有提供模式,那么awk就认为所有的行都是匹配的,并执行{}中的语句
注意:使用不带参数的print是,它会打印出当前行,关于print需要记住2点:当print的参数以逗号分隔时,打印结果以空格作为定界符。当print参数以空格分隔时,打印结果之间没有分隔。
如:echo | awk '{  var1="v1";var2="v2";var3="v3"; print var1,var2,var3;}'
结果为v1  v2  v3
echo | awk '{  var1="v1";var2="v2";var3="v3"; print var1 var2 var3;}'
结果为v1v2v3
echo | awk  '{  var1="v1";var2="v2";var3="v3"; print var1  "-"  var2  "-"  var3; }'
结果为v1-v2-v3
3、补充内容
(1)特殊变量
NR:表示记录数量,在执行过程中对应于当前行号
NF:表示字段数量,在执行过程中对应于当前行的字段数
$0:表示执行过程中的当前行文本内容
$1:表示第一个字段的文本内容
$2:表示第二个字段的文本内容
常见用法:$NF代表最有一个字段   $(NF-1)代表倒数第二个字段
打印没一行的第3、第2个字段   awk '{  print $3,$2 }' file
统计文件中的行数 awk 'END{print NR}' file
每行第一个字段相加 seq 5 | awk ‘BEGIN{sum=0;print "SUmmation:"}  {print $1 "+";sum+=$1} END {print "==" print sum }’
4、awk使用外部标量
(1)使用-v
VAR=10000
echo | awk -v VARIABLE=$VAR '{print VARIABLE}'
(2)使用键值对的方式,以空格分隔,跟在BEGIN {} END语句块之后
echo | awk ‘{ print v1,v2}'  v1=$var1  v2=$var2
5、getline
语法:getline var。变量var就宝航特定行的内容,如果调用不带参数的getline,我们可以用$0,$1,$2访问文本行的内容
seq 5 | awk 'BEGIN { getline; print "Read ahead first line",$0 }  {print  $0}'
6、使用规律模式对awk处理进行过滤
awk  'NR < 5'     行号小于5的行
awk 'NR==1,NR==4'  行号在1到4之间的行
awk '/linux/' 包含linux的行
awk '!/linux/' 不包含linux的行
7、从awk中读取命令输出
echo | awk '{ "grep root /etc/passwd" | getline cmdout;print cmdout} '
8、awk中使用循环
for(i=0;i<10;i++)  { print $i ; }
或者
for(i in array) { print array[i]; }
9、awk內建字符串控制函数
length(strng)
index(srtring,search_string)
split(string,array,delimiter)
substr(stirng,start-position,end-position)
sub(regex,replacement_str,string)
gsub(regex,replacement_str,string)
match(regex,string)      RSTART、RLENGTH
 
例子:
$ echo "hahahahahahhaha" | awk '{sub(/h/,"ok",$0);print $0}'   //只匹配第一个
okahahahahahhaha
$ echo "hahahahahahhaha" | awk '{gsub(/h/,"ok",$0);print $0}'  //全部匹配
okaokaokaokaokaokokaoka
 
10、应用:统计词频
 
#!/bin/bash
#文件名:word_frea.sh
#用途:计算文件中的单词词频
 
if [  $#  -ne 1 ];
then
    echo "Usage:$0 filename";
    exit 1
fi
 
filename=$1
 
egrep -o "\b[[:alpha:]]+\b" $filename | \
awk '{ count[$0]++}  
END {printf ("%-14s%s\n" , "Word","Count");
for(ind in count)
{ printf("%-14s%s\n",ind,count[ind]);
}
}'

SED&AWK的更多相关文章

  1. Sed&awk笔记之sed篇

    http://blog.csdn.net/a81895898/article/details/8482387 Sed是什么 <sed and awk>一书中(1.2 A Stream Ed ...

  2. linux sed awk seq 正则使用 截取字符 之技巧

    [root@room9pc01 ~]# seq 5 1 2 3 4 5 [root@room9pc01 ~]# seq 2 5 2 3 4 5 seq 1 2 10 1 3 5 7 9 [root@d ...

  3. 1.Sed | Awk | Grep | Find

    1.Sed | Awk | Grep | Find 可以参考的文档链接 CentOS7 查看 当前机器 已经启动的端口的Shell命令: netstat -lntup | awk -F' ' {'pr ...

  4. Sed&awk笔记之sed篇(转)

    Sed是什么 <sed and awk>一书中(1.2 A Stream Editor)是这样解释的: Sed is a "non-interactive" strea ...

  5. [svc]linux正则实战(grep/sed/awk)

    企业实战: 过滤ip 过滤出第二行的 192.168.2.11. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ine ...

  6. linux三剑客grep|sed|awk实践

    最好先学习正则表达式的基本用法,以及正则表达式BREs,EREs,PREs的区别 此坑待填 grep sed awk

  7. Linux三剑客grep/sed/awk

    grep/sed/awk被称为linux的“三剑客” grep更适合单纯的查找或匹配文本: sed更适合编辑匹配到的文本: awk更适合格式化文本,对文本进行较复杂各式处理: Grep --color ...

  8. 【转帖】vim/sed/awk/grep等文件批处理总结

    vim/sed/awk/grep等文件批处理总结 https://www.cnblogs.com/cangqiongbingchen/p/9760544.html Vim相关操作 1.基础 * 和 # ...

  9. sed & awk 概述

    概述 一般情况下,从grep到sed和awk的学习过程是很自然的.sed和awk是一般用户.程序员和系统管理员们处理文本文件的有力工具. sed的名字来源于其功能,它是个字符流编辑器(stream e ...

  10. sed awk grep三剑客常用

    sed的常用用法: awk的常用用法: grep的常用用法: 除了列出符合行之外,并且列出后10行. grep -A 10 Exception kzfinance-front.log 除了列出符合行之 ...

随机推荐

  1. 能让汇编转到C51的初学者有更清晰的认识的一篇文章

    8051 是傳統 CISC 架構微控制器的代表,而 PIC 則是現代 RISC 架構微控制器的佳作. 雖然說 RISC 架構是公認未來微控制器的主流,但是 8051 藉著累積多年的發展環境與資源,特別 ...

  2. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(1)--后端

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(1)--后端 chsakell分享了前端使用AngularJS,后端使用ASP.NET Web API的购物车 ...

  3. CentOS6.4/6.7下Mysql数据库的安装与配置(转载)

    通过RPM方式 给centos  安装mysql  最好有光盘,呵呵,网络也可以下载rpm安装包,不过文件较大. 1 挂载光盘 mount /dev/cdrom /mnt/cdrom/mount: b ...

  4. Poj2946-The Warehouse(bfs+哈希)

    题目我就不粘贴了... 题意:给出地图,最大8*8,出口用'E'表示,空地用'.'表示,数字表示此处有多少个箱子,主人公的起点应该是在有箱子的地方,他可以朝四个方向移动,但是只有两种方式 一种是他移动 ...

  5. 初探JS正则表达式

    1.概述     正则表达式是一个描述字符模式的对象.Javascript的正则表达式语法的是Perl5的正则表达式的子集.JS正则表达式有两种使用方式,文本模式和RegExp对象模式,实例如下: v ...

  6. extjs tree check 级联选择

    extjs4 tree check 级联选择 实现效果: 关键代码: function changeAllNode(node, isCheck) { allChild(node, isCheck); ...

  7. POJ训练计划2777_Count Color(线段树/成段更新/区间染色)

    解题报告 题意: 对线段染色.询问线段区间的颜色种数. 思路: 本来直接在线段树上染色,lz标记颜色.每次查询的话訪问线段树,求出颜色种数.结果超时了,最坏的情况下,染色能够染到叶子节点. 换成存下区 ...

  8. Android控件TextView的实现原理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8636153 在前面一个系列的文章中,我们以窗口 ...

  9. SQL:deferrable initially deferred

    SQL> create table cust(id number,name varchar2(10));Table created SQL> alter table cust add co ...

  10. [Spring入门学习笔记][Spring的AOP原理]

    AOP是什么? 面向切面编程 软件工程有一个基本原则叫做“关注点分离”(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题.这年头互联网也 ...