awk、sed对处理日志文件和写shell脚本时非常有益。这个东西,如果不经常操作,真心过一段时间就忘差不多。。要掌握熟练,就要多练习,这没什么可说的。

awk '条件{命令}' filename

假设一个待处理的文件test是这样的:

比如我需要第一列是tcp的,并打印出第4列和第6列

  awk '/^tcp/ {print $4,"\t",$6}' test

 或者 awk '$1 == "tcp" {print $4,"\t",$6}' test

比如我想在刚才打印的两列上边,写个头。比如4列头是aaa,6列头是bbb。4列尾是ccc,6列尾是ddd

  awk 'BEGIN {print "aaa","\t","bbb"} /^tcp/ {print  $4,"\t",$6} END {print "ccc","\t","ddd"}' test

第二列显然没对齐,可以使用类似于C语言的printf格式化输出。

值得注意的是,awk是以文件每一行进来处理的。

不难发现,语法中单引号里头,都是按照"条件+{动作}"这种格式来的。

比如BEGIN是条件, {print "aaa","\t","bbb"}是动作;BEGIN是在文件处理第一行开始前先执行的。

/^tcp/ 是条件,{print  $4,"\t",$6}是动作;

END是条件,{print "ccc","\t","ddd"}是动作。END是在文件处理结束以后,执行的。

当一个动作{A}前边紧接着还是个{动作X},就意味着A这个动作没有条件,就是指什么条件都可以。

awk中几个内置变量很常用。F表示字段,域,是Field...

比如FS是分隔符号,NR是awk读取的记录数(awk是一行一行的读取),NF是读取的列数

NR:number of records  原文件记录的第几行数

NF:number of fields   该行记录的总列数

举个例子:用户文件/etc/passed是以冒号分隔的

awk '{FS=":"}{print $1,"\t",$2}' /etc/passwd | head -n10

发现第一行并没有得到我们想要的效果。这是因为{FS=":"}这个命令前边并没有条件限制,而此时awk已经把第一行读完了。所以如此。

这里就需要在{FS=":"}这个命令的前边加上BEGIN关键字就好了。

还有很多例子...

前边的NR、NF是awk的内置变量。awk也可以自定义变量,awk编程。

比如上边的/etc/passwd中有多少个用户(也是多少行...)并且输出每个用户名

利用awk编程实现可以这样:

# awk -F ':'  '{num++; print $1;}  END {print 'total is ', num}'

{ }中两个命令使用分号 ; 分隔。

输出的分隔符,比如输出的列用逗号分割,利用OFS

awk -F',' 'BEGIN{OFS=","} {print $2,$6,$9}'  xx.log

再举个例子:找出文件xxx.txt中不是以#开头的所有行

awk '{if($1!~/^#/) print $0}' xxx.txt

sed的命令( stream editor 流编辑器),同样是对行的处理。注意匹配什么

s是替换,重点是匹配什么。

d是删除,用数字表示行,或者也利用匹配行

i是行前插入

a是行后追加

c是替换整个行

===========---------------几个例子

比如删除2到4行的内容

sed '2,4d' filename

sed '2,$d' filename   从第二行开始都删除

sed '/^#/ d' filename #开头的行删除

清除一个文件的空行

sed '/^$/d' test.log > test1.log

数字替换成xx

sed 's/[0-9]/xx/g'

替换8到10行的内容,把其中每行出现的udp替换成tcp

sed '8,10s/udp/tcp/g' filename

如果说只替换每行出现的第一个,这样写

sed 's/udp/tcp/1' filename

在第一行插入字符串hehe,换行

sed '1 i hehe' filename

在原来的第2行到第4行上,都插入xxx

sed '2,4 i xxx' filename

在第2行后面追加字符串hi,换行

sed '2 a hi' filename

在原来的第2行到第4行上,都追加xxx

sed '2,4 a xxx' filename

取出一个文件a.log的2到12行内容

sed -n '2,12p'  a.log

推荐以下这几篇文章,很不错的哈:

sed:

http://coolshell.cn/articles/9104.html

awk:

http://coolshell.cn/articles/9070.html

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

http://www.linuxsong.org/2010/09/awk-string-function/

awk提供了许多强大的字符串函数,见下表:
awk内置字符串函数

gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字符串t的第一位置
length(s) 返回s长度
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs) 在fs上将s分成序列a
sprint(fmt,exp) 返回经fmt格式化后的exp
sub(r,s) 用$0中最左边最长的子串代替s
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

比如应用一个

awk -F'xxx' '{print substr($1,0,index($1," ")),substr($2,0,index($2,"\"")-1)}'

awk、sed处理文件的简单例子的更多相关文章

  1. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  2. SpringMvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  3. C++读写文件的简单例子

    #include <iostream> #include <fstream> using namespace std; void main() { ofstream in; i ...

  4. linux的文件处理(匹配 正则表达式 egrep awk sed)和系统、核心数据备份

    文件处理 1.处理方式 匹配 正则表达式 egrep awk sed 2.文件中的处理字符 \n  新行符 换行 \t  制表符 tab键 缺省8个空格 \b  退格符 backspace键 退格键 ...

  5. java IO文件操作简单基础入门例子,IO流其实没那么难

    IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...

  6. c 语言申明头文件和实现分开简单例子

    很多时候,看到很多c函数的声明和实现是分开的.声明放在头文件,实现却放在另一个文件,最后函数被其他文件调用. 下面以简单例子说明. 一.声明部分 /* test.h */ #include <s ...

  7. 使用Sed和Awk实现批量文件的文本替换

    摘要: 使用 Sed 完成文本替换操作任务是非常合适的.结合 find 命令,即可实现指定批量文件的文本替换.同时给出了Awk的解决方案作为对比. 问题 现在, 我要将一个原有Java项目中的一些包及 ...

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

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

  9. awk sed 总结

    Awk总结笔记 介绍 90年代 new awk :nawk Linux 的是gawk 我们简化awk 用法 #  awk [options ] ‘scripts’ file1 file2 .... # ...

随机推荐

  1. Javascript 函数及其执行环境和作用域

    函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: va ...

  2. CF712E Memory and Casinos

    设\(f[i]\)为从\(i\)到\(r+1\)且不走出区间的概率 \(f[i]=p[i]f[i+1]+(1-p[i])f[i-1]\) \(f[i]-f[i-1]=p[i](f[i+1]-f[i-1 ...

  3. cf250D. The Child and Sequence(线段树 均摊复杂度)

    题意 题目链接 单点修改,区间mod,区间和 Sol 如果x > mod ,那么 x % mod < x / 2 证明: 即得易见平凡, 仿照上例显然, 留作习题答案略, 读者自证不难. ...

  4. WebSerivce与WebAPI的区别

    一.什么是Web Service Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应 ...

  5. 修复vs2012出现 “无法找到包源”的错误

    出现以上问题,需要去“控制面板”添加程序,找到vs2012右键“修改” 用来安装 web Developer 如下图所示: 点击继续

  6. GIT回推本地commit近期版本

    一次意外吧,本地add并且commit之后拉了别人错误的代码下来,后来本地又需要进行编写测试,无奈只能回推到自己刚刚commit过的代码,但是git命令除了拉去提交等其他的不是很熟悉,在度娘之后也遇到 ...

  7. 将 Windows VM 移到其他 Azure 订阅或资源组

    本文逐步说明如何在资源组或订阅之间移动 Windows VM. 如果最初在个人订阅中创建了 VM,现在想要将其移到公司的订阅以继续工作,则在订阅之间移动 VM 可能很方便. Important 不可在 ...

  8. SQL Server复制入门(一)----复制简介 (转载)

    简介SQL Server中的复制(Replication)是SQL Server高可用性的核心功能之一,在我看来,复制指的并不仅仅是一项技术,而是一些列技术的集合,包括从存储转发数据到同步数据到维护数 ...

  9. Safari中的Date

    在js中处理Date时,发现Safari和其他浏览器的支持方式不一致 1.例如:2017-01-01 12:00:00 在其他浏览器中,使用这个格式的字符串进行new Date操作没有问题,但是在Sa ...

  10. 转:queue

    数据结构C#版笔记--队列(Quene)   队列(Quene)的特征就是“先进先出”,队列把所有操作限制在"只能在线性结构的两端"进行,更具体一点:添加元素必须在线性表尾部进行, ...