zoukankan      html  css  js  c++  java
  • 纯命令行的编辑利器:用好 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
    
  • 相关阅读:
    从技术走向管理
    一位大龄程序员所经历的面试的历炼和思考
    从技术谈到管理,把系统优化的技术用到企业管理
    Xamarin.iOS 开发 1通过“与 Mac 配对”进行 Xamarin.iOS 开发
    net 开源工作流比较及应用
    net core体系-UWP
    net 架构-5 ABP框架的Web API调用类在Winform项目中的使用
    net 架构-4ABP框架的Web API调用类的封装和使用
    MVC后台的几种跳转方法
    sqlserver存储过程杀掉数据库中死锁
  • 原文地址:https://www.cnblogs.com/1si2/p/sed_awk.html
Copyright © 2011-2022 走看看