博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
纯命令行的编辑利器:用好 awk 与 sed
阅读量:6708 次
发布时间:2019-06-25

本文共 2130 字,大约阅读时间需要 7 分钟。

awk 的基本语法

awk 是模式查找与处理语言,是文本处理的利器。使用 awk 可以只用一条简单的命令完成复杂的文本数据处理。 awk 命令的基本结构为:

awk '模式 {处理}' 文件

比如,打印 datafile.txt 中所有包含 Female 的行:

awk '/Female/ {print $0}' datafile.txt

datafile.txt 的内容:

Bob   23   MaleTim   18   MaleKate  19   FemaleAnn   18   FemaleJim   23   Male

输出的结果为:

Kate  19   FemaleAnn   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   MaleTim   18   MaleKate  19   FemaleAnn   18   FemaleJim   23   Male

sed 常见用法

# 打印包含数字 1 的所有行sed -n '/1/ p' datafile.txt# 打印所有行sed -n 'p' datafile.txtsed '' datafile.txt# 将 Female 或者 Male 的首字母变为小写sed 's/\([0-9][ \t]\+\)\(.\)/\1\l\2/' datafile.txtsed -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.txtsed -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

转载于:https://www.cnblogs.com/1si2/p/sed_awk.html

你可能感兴趣的文章
选择http协议还是tcp协议
查看>>
我的友情链接
查看>>
SNBannerView 无限循环滚动轮播图 集成简单 高效
查看>>
Yii框架官方指南系列25——使用数据库:Active Record
查看>>
Android:ANR、线程间通讯、Handler、Message
查看>>
抽象工厂模式实现DB的封装(续)
查看>>
linux命令之git
查看>>
SQLPlus环境设置
查看>>
如何解决crontab脚本执行sudo
查看>>
大数据应用之HBase数据插入性能优化之多线程并行插入测试案例
查看>>
phalcon的nginx重写实现模仿apache下的.htaccess
查看>>
使用用户自定义的辅助实例执行基于表空间的时间点恢复
查看>>
Mybatis XML 映射配置文件
查看>>
MySQL深入03-锁-事务-GTID
查看>>
HTML学习日记(1-基础)
查看>>
如何查看mysql的用户及授权
查看>>
JAVA jacob office转换pdf代码
查看>>
Java 命令行运行参数大全
查看>>
Oracle学习之路-SQL篇-连接查询
查看>>
我的友情链接
查看>>