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. 【读书笔记】iOS-网络-解析响应负载

    Web Service可以通过多种格式返回结构化数据, 不过大多数时候使用的是XML与JSON.也可以让应用只接收HTML结构的数据.实现了这些Web Service或是接收HTML文档的应用必须能解 ...

  3. MariaDB MySQL变量取值避免四舍五入的方法

    MySQL变量取值避免四舍五入的方法 By:授客 QQ:1033553122 在一些对数据精确度要求比较高的场景(比如资金结算)下,变量取值时不能对变量值进行四舍五入操作,这时候就要做些预处理工作. ...

  4. 如何解决Your project contains C++ files but it is not using a supported native build system

    最近因为项目需要下载Android终端模拟器(Android-Terminal-Emulator)源码进行调试编译,编译过程中出现报错 Error:Execution failed for task ...

  5. springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本 get请求报400 异常信息为 The valid characters are defined in RFC 7230 and RFC 3986

    1.springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本而之前用的是tomcat7    get请求报400 异常信息为 The valid characters are ...

  6. python subprocess pipe 实时输出日志

    * test11.py import time print "1" time.sleep(2) print "1" time.sleep(2) print &q ...

  7. 从零自学Java-6.使用循环重复执行操作

    1.使用for循环: 2.使用while循环: 3.使用do-while循环: 4.提早退出循环(break,continue): 5.为循环命名. 程序Nines:显示1-200的整数与9的乘积 p ...

  8. Prometheus Node_exporter 之 Network Netstat

    Network Netstat /proc/net/netstat 1. Netstat IP In / Out type: GraphUnit: shortLabel: Datagrams out ...

  9. VScode开发Vue项目,关闭eslint代码检查,以及相关配置

    Vue初始化项目时如果不小心安装了js 语法检测 功能,撸码时一个空格不对就会各种报错 个人感觉这个语法检测功能很有点过于严格,用起来十分难受,所以果断关闭eslint,找到webpack.base. ...

  10. CSS| 實例---寬度自由調節button,圖片切換

    <html lang="en"> <head> <meta charset="utf-8"/> <title>I ...