awk、sed处理文件的简单例子
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处理文件的简单例子的更多相关文章
- spring mvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- SpringMvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- C++读写文件的简单例子
#include <iostream> #include <fstream> using namespace std; void main() { ofstream in; i ...
- linux的文件处理(匹配 正则表达式 egrep awk sed)和系统、核心数据备份
文件处理 1.处理方式 匹配 正则表达式 egrep awk sed 2.文件中的处理字符 \n 新行符 换行 \t 制表符 tab键 缺省8个空格 \b 退格符 backspace键 退格键 ...
- java IO文件操作简单基础入门例子,IO流其实没那么难
IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...
- c 语言申明头文件和实现分开简单例子
很多时候,看到很多c函数的声明和实现是分开的.声明放在头文件,实现却放在另一个文件,最后函数被其他文件调用. 下面以简单例子说明. 一.声明部分 /* test.h */ #include <s ...
- 使用Sed和Awk实现批量文件的文本替换
摘要: 使用 Sed 完成文本替换操作任务是非常合适的.结合 find 命令,即可实现指定批量文件的文本替换.同时给出了Awk的解决方案作为对比. 问题 现在, 我要将一个原有Java项目中的一些包及 ...
- 【转帖】vim/sed/awk/grep等文件批处理总结
vim/sed/awk/grep等文件批处理总结 https://www.cnblogs.com/cangqiongbingchen/p/9760544.html Vim相关操作 1.基础 * 和 # ...
- awk sed 总结
Awk总结笔记 介绍 90年代 new awk :nawk Linux 的是gawk 我们简化awk 用法 # awk [options ] ‘scripts’ file1 file2 .... # ...
随机推荐
- 退役前的最后的做题记录upd:2019.04.04
考试考到自闭,每天被吊打. 还有几天可能就要AFO了呢... Luogu3602:Koishi Loves Segments 从左向右,每次删除右端点最大的即可. [HEOI2014]南园满地堆轻絮 ...
- 31:字符串p型编码
31:字符串p型编码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个完全由数字字符('0','1','2',…,'9')构成的字符串str,请写出s ...
- js-ES6学习笔记-修饰器
1.修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时.这意味着,修饰器能在编译阶段运行代码. 2. function testable(target) { target.isTestable ...
- OSGI企业应用开发(十三)OSGI Web应用开发(二)
上篇文章介绍了OSGI Web应用的两种开发模式,并把Jetty应用服务器以Bundle的形式整合到Equinox容器中,已这种模式开发Web应用,所有的应用程序资源,例如Servlet.JSP.HT ...
- Eclipse中JSP生成的类文件存放在哪
Jsp页面看上去和HTML相似,但它实际上是作为Servlet运行的. 当JSP页面第一次被访问时,web容器解析jsp文件并将其转化为相应的java文件,该文件声明了一个servlet类,该类称为页 ...
- T-SQL的timestamp类型实际应用
目录 0x00 适用场景 0x01 问题描述 0x02 字节数组 0x03 Base64编码 0x04 其实没那么麻烦 0x05 回顾 0x00 适用场景 1. 前端: JavaScript 2. 后 ...
- 如何在 Azure 中均衡 Windows 虚拟机负载以创建具有高可用性的应用程序
负载均衡通过将传入请求分布到多个虚拟机来提供更高级别的可用性. 本教程介绍了 Azure 负载均衡器的不同组件,这些组件用于分发流量和提供高可用性. 你将学习如何执行以下操作: 创建 Azure 负载 ...
- CSS| 颜色名
CSS 颜色名 所有浏览器都支持的颜色名. HTML 和 CSS 颜色规范中定义了 147 中颜色名(17 种标准颜色加 130 种其他颜色).下面的表格中列出了所有这些颜色,以及它们的十六进制值. ...
- centos7 安装 jdk1.8
首先是Linux的不同版本的额系统自带的配置是不一样的,比如centos6上有的自带的jdk环境的话要装1.8的就要进行卸载或者马上进行更改 jdk是java程序依赖的环境 首先查看你的系统下是否有j ...
- 代理工具--mitmproxy
#代理工具 mitmproxy 指令:mitmproxy -b ip -p port(代理ip设置为:ip,端口设置为:port) 拦截request: 输入字母“i”(代表Intercept fil ...