纯命令行的编辑利器:用好 awk 与 sed
awk 的基本语法
awk 是模式查找与处理语言,是文本处理的利器。使用 awk 可以只用一条简单的命令完成复杂的文本数据处理。 awk 命令的基本结构为:
awk '模式 {处理}' 文件
比如,打印 datafile.txt 中所有包含 Female 的行:
awk '/Female/ {print $0}' datafile.txt
datafile.txt 的内容:
Bob 23 Male
Tim 18 Male
Kate 19 Female
Ann 18 Female
Jim 23 Male
输出的结果为:
Kate 19 Female
Ann 18 Female
以上命令中: /Female/ 就是一个正则表达式,awk 会一行行读取文件,如果遇到某一行与该正则表达式匹配,则执行后面的 {print $0} 操作。
awk 的常见用法
继续用上面的 datafile.txt 为内容举例如下:
# 计算所有 Male 及 Female 各多少人
awk '/Male/ {m++} /Female/ {n++} END {print "Male", m, "Female", n}' datafile.txt
# 计算 Male 的平均年龄
awk '/Male/ {m++; n+=$2} END {print n/m}' datafile.txt
# 以字符 'm' 作为分隔符分隔一行,并打印每行的第一段
awk 'BEGIN {FS="m"} // {print $1}' datafile.txt
# 以数字作为分隔符分隔一行,并打印1-3行的第一、二段,4-5行的第一段
awk 'BEGIN {FS="[[:digit:]]+"} NR<=3 {print $1,$2} NR>3 {print $1}' datafile.txt
# 打印年龄不包含数字 1 的行
awk '! /1/ {print $0}' datafile.txt
# 打印年龄为 18 的行
awk '$2 == 18 {print $0}' datafile.txt
在 linux 系统中,awk 可以通过管道处理一些数据
# 杀掉监听 10080 端口的进程
netstat -nap | awk 'BEGIN {FS="[ /]+"} /LISTEN/ && /10080/ {print $7}' | xargs kill -9
# 统计 Apache 的访问日志,各个 IP 的访问次数是多少
awk '// {m[$1]++} END {for (i in m) print i "\t" m[i]}' /etc/httpd/logs/access_log
sed 的基本语法
如果把 awk 比作文本查询语言的话,sed 就是文本修改语言。两者配合基本上可以不用打开文本文件就可以实现类似于数据库操作的增删改查工作。这一点在批量处理文件的时候非常重要。
sed 的基本结构与 awk 类似:
sed '模式 处理' 文件
sed '模式 {处理序列}' 文件
比如,以 datafile.txt 为例,将 Bob 的年龄修改为 124 岁
sed 's/\(Bob[ \t]*\?\)\([0-9]\+\)/\1124/' datafile.txt
将会显示以下的结果:
Bob 124 Male
Tim 18 Male
Kate 19 Female
Ann 18 Female
Jim 23 Male
sed 常见用法
# 打印包含数字 1 的所有行
sed -n '/1/ p' datafile.txt
# 打印所有行
sed -n 'p' datafile.txt
sed '' datafile.txt
# 将 Female 或者 Male 的首字母变为小写
sed 's/\([0-9][ \t]\+\)\(.\)/\1\l\2/' datafile.txt
sed -n '{s/\([0-9][ \t]\+\)\(.\)/\1\l\2/ p}' datafile.txt
# 将 Female 或者 Male 的前三个字母大写,后面的小写
sed 's/\([0-9][ \t]\+\)\(....\)\(.*\)/\1\U\2\L\3\E/' datafile.txt
sed -n '{s/\([0-9][ \t]\+\)\(....\)\(.*\)/\1\U\2\L\3\E/ p}' datafile.txt
# 删除奇数行,如1,3,5行
sed '1~2 d' datafile.txt
# 统计文件有多少行
sed -n '$=' datafile.txt
# 实现 head 的功能
sed '2 q' datafile.txt
# 打印每行行号
sed '=' datafile.txt
# 先找到文档中的数字行,从数字行开始删除一直删除到有空行为止
sed '/[0-9]/,/^$/ d' data
纯命令行的编辑利器:用好 awk 与 sed的更多相关文章
- Linux命令行下编辑常用的快捷键
Linux命令行编辑快捷键: Ctrl+r 然后输入若干字符,开始向上搜索包含该字符的命令,继续按Ctrl+r,搜索上一条匹配的命令,按Ctrl+c或上下键退出. Ctrl+l 清屏 !num 执行命 ...
- 我的ubuntu连vi都没有??那在命令行怎么编辑文件??
今天弄了个docker下的ubuntu官方镜像,想在镜像里做一点实验,免得把自己的环境写得乱七八糟. 把代码文件mount进去之后,开始编译,但是镜像太干净了,什么工具都没有,于是先装cmake ap ...
- mysql定时任务(数据库管理工具and 纯命令行)
1.工具:Navicat 2.通过下列语句l爱查询event是否开启 打开Navicat命令列界面(点击工具可以看到或按F6) 输入下面命令 show variables like '%sche%'; ...
- shell命令行快速编辑命令
ctrl r:命令行出现 reverse-i-search,输入字符将在输入历史中匹配命令 ctrl p:向前翻看历史 ctrl n:向后翻看历史 ctrl a:命令行首 ctrl e:命令行尾 ct ...
- mvn从下载安装到纯命令行创建第一个mvn程序(编码,编译,测试,安装,打包)全过程细致分解
1.maven的下载和安装: a.maven的下载注意事项:如果你是windows,请选择①号,如果你是linux,请选择②号,下载地址:http://maven.apache.org/downloa ...
- ubuntu进入纯命令行
启动按shfit 然后光标在第一行按e 倒数第二行末尾添加quiet splash $vt_handoff 3 然后按CTRL+X或F10引导系统,启动之后就是命令行模式了
- mysql 取消命令行继续编辑
mysql> create database mingongge defa\c#回车 置空mysql> 加一个\c cancel 编辑命令 回车
- PathMarker:命令行快速编辑跳转工具(配合git,find等)
简介 当使用git, find等工具时,一般需要进一步打开文件或跳转目录. 通常的做法是使用鼠标复制黏贴,或者手工输入. PathMarker提供一种快速通过标号,编辑相关文件,跳转相关目录的方法,提 ...
- 第三篇:Linux的基本操作与文件管理(纯命令行模式下)(下)
接上篇介绍完软件的管理(查询.删除.安装)之后,本篇将介绍Linux的文件和目录的管理. 如何浏览Linux的目录(文件夹),就像Windows一样,我们平时需要打开各个目录,去里面找一找曾经悄悄存储 ...
随机推荐
- byte[] 转十进制
short s = 0; //一个16位整形变量,初值为 0000 0000 0000 0000 byte b1 = 1; //一个byte的变量,作为转换后的高8位,假设初值为 0000 0001 ...
- [译]:Xamarin.Android平台功能——位置服务
返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...
- 【学习篇:他山之石,把玉攻】JavaScript Date() 对象 及 格式化
Date 对象用于处理日期和时间. 创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值. 参数形式有以下5种: new ...
- 号称21世纪的编辑器Atom
上个月无意中在一篇软文中看到一篇前端排行榜,其中有一项排行就是编辑器,而排在前三的编辑器分别是sublime.Atom.webstorm.出于好奇,简单的在网上查看了介绍,原来全球最大开源分享网站gi ...
- json相关,浏览器打开json格式的api接口时,进行格式化,chrome插件
在chrome浏览器中安装Google jsonview插件能够自动格式化json格式的数据.
- PTAM 编译安装 on MAC(mavericks)
最近有需要研究PTAM,所以需要在我的MAC上编译安装,整个过程让人非常崩溃各种问题陷阱.现在整理一下编译过程.我已经成功在MAC上编译.那么接下来我会详细讲解整个过程: 注意: 部分链接可能需要FQ ...
- 从零点壹开始学JAVA(DAY 1 笔记)<补充记录>
一个同事的先生(下面称呼其为耿大神)是做开发的,比较资深的那种,在他们公司的核心技术部门. 幸运的是,耿大神很乐意帮助我这株小白菜,在业余时间指导我,这里深表感谢. 耿大神隔段时间会给我提一些问题,让 ...
- 关于scale和zoom的区别
其实关于scale,我之前是用他来搞一些css3的特效的放大缩小啊,玩的也挺6666,而*zoom:1之前是用来做css的hack,也就是触发IE6/7的haslayout清除浮动的.终于某天,好事的 ...
- web常见错误提示总结
在写web程序的时候,经常会出现一些网页错误的数字提示,如果能够明白这些提示的含义,那对于调试程序是有极大帮助的.网上有很多这方面的总结,但为了适应自己的阅读习惯,以及日后的查找方便,就做了一些修改并 ...
- java分享第十七天-03(封装操作mysql类)
JAVA操作mysql所需jar包:mysql-connector-java.jar代码: import java.sql.*; import java.util.ArrayList; import ...