awk与sed、grep一样都是为了加工数据流而做成的文本加工过滤器命令。awk会事先把输入的数据根据字段单位进行分割。在没有指定分割单位的情况下,以输入数据中的空格或Tab为分隔符。与sed相比,它以更接近编程语言的文法进行处理,还包括了通过正则表达式进行的字符串操作、简单的数学函数功能等。

sed的基本形式

sed 启动选项 '地址 命令/查找字符串/替换字符串/标志' 输入.txt > 输出.txt

启动选项

​ -e '单行脚本'; -f 脚本文件; -g 整个文章作为对象(global)

​ -i 将结果覆盖到源输入文件中,可以指定后缀名生成备份文件,如-i.bak

地址

举例 含义
(空,未指定) 所有行
2 第2行
11,$ 11~最后一行
4,10! 4~10行以外的行
/^[0-9]/ 所有以数字开头的行
2,/END$/ 从第2行开始到以END结尾的行

命令 可以使用;分割组合使用多个命令,按顺序执行。

s字符串替换;y字符替换;d删除;

p直接输出;w文件输出;n数据输入

双直引号与单直引号为了防止其中的字符作为shell的特殊字符处理。

sed命令操作

s命令替换字符串

cat /etc/passwd | sed "s!/bin/bash$!/bin/zsh!g"

表示将行末以/bin/bash结尾的行中的/bin/bash替换为/bin/zsh其中感叹号!为分隔符,也可以用/、\、#、甚至任意的英文字母,只要不与要替换的字符串发生混淆即可。标志g表示将整个文档作为替换范围,而不是仅替换第一次出现的位置。

sed -e 's!//!#!' hello.c #将//替换为#

sed -e 's/var/+&+/g' a.txt #将var替换为+var+

sed -e 's/.*/result: &/gw output.txt' a.txt

&表示对前边待替换字符串中正则表达式匹配的字符串的引用。

w 指定输出文件名,将替换后的结果写到文件。

y命令替换字符

sed -e 'y/abc/xyz' a.txt #同时进行a->x, b->y, c->z的替换

d命令删除行

sed -e '1,5d' a.txt #删除前5行后输出剩余内容

sed -e 'd' a.txt #删除全文,输出为空,输入文件并不改变

p命令输出

sed -n -e '2,$p' a.txt

sed -n -e '/^aaa/,/eee$/p' a.txt #以aaa开头的行到以eee结尾的行

脚本文件中命令的组合

对于一个地址可以执行{多个命令}

2,6{
命令1
命令2
....
}

脚本文件结构-标签、分支、循环

: 标签
命令1,2,3...
/模式/b 标签
命令x

示例-删除所有换行符合并字符串

:loop		#循环执行的开始位置
N #字符串合并
$!b loop #不是最后一行时跳转
s/\n//g #删除换行符

awk

基本用法

命令基本用法:awk [-F域分隔符] '{pattern + action}' {filenames}

默认的域分隔符是空格,可以指定'\t','\n'等分隔符。其中 pattern 表示 awk 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。

通常,awk 是以文件的一行为处理单位的。awk 每接收文件的一行,然后执行相应的命令,来处理文本。

待处理的文件可以是多个,后面有处理多个文件的例子。

支持awk '/正则表达式/' testfile 筛选匹配的行,支持sub,match,split等正则表达式函数。

正则表达式匹配查找(match使用)

$ awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'

ok

awk内置变量

变量 解释
$n 当前记录的第n个字段,n为1表示第一个字段
$0 执行过程中当前行的文本内容
ARGC 命令行参数的数目
ARGV 包含命令行参数的数组
ARGIND 命令行中当前参数的位置(从0开始算)
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前输入文件的名字
FS 字段分隔符(默认是任何空格)
FNR 当前行在正在处理的文件中的行号
NR 在执行过程中对应于当前的行号(已处理的所有文件的记录数)
NF 表示字段数,在执行过程中对应于当前的字段数
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出字段分隔符(默认值是一个空格)
ORS 输出记录分隔符(默认值是一个换行符)
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
RLENGTH 由match函数所匹配的字符串的长度
SUBSEP 数组下标分隔符(默认值是34)
IGNORECASE 如果为真,则进行忽略大小写的匹配

print $NF打印一行中最后一个字段; $(NF-1)代表倒数第二个字段。

awk内置函数

awk提供了一些内置函数,方便对原始数据的处理。如函数toupper($1)用于将字符串$1转为大写。

  • length():返回字符串长度。
  • substr():返回子字符串。
  • sin():正弦。
  • cos():余弦。
  • sqrt():平方根。
  • rand():随机数。

示例1-脚本

可以编写awk脚本,然后传给awk进行解释执行:awk -f awk-script-file input-file(s)

awk统计各个登录shell的用户数:

$ awk '
BEGIN{ FS=":" } #修改字段分隔符为:
{ shells[$NF]++;} #NF保存的是输入行的字段数,$NF可以访问最后一个字段的值
END{
for(sh_i in shells)
print sh_i ": " shells[sh_i];#输出类似/bin/bash: 3
}' /etc/passwd

示例2-日志解析

  1. 输出特定行

    sed -e '100,200p' 文件名

  2. 统计行数

    awk '{count++} END {print count}' 文件名

  3. 统计目录下文件的总大小

    ls -l | awk '{size+=$5} END {print size}'

  4. 在控制台中高亮显示一些信息

    sed -e 's/\(Failed password\)/\x1b[1;36;44m\1\x1b[0m/' /var/log/secure

    其中\x1bESC这一字符的16进制表示,1;36;44表示文字风格;文字颜色;背景色,用[x;y;zm表示这个组合的绑定,\x1b[0m表示文字修饰结束。中间的\1引用前面匹配的\(内容\)

    可选高亮设置

    文字风格
    0 重置风格
    1 粗体
    4 下划线
    5 点线
    7 颜色反转
    8 隐藏
    值(文字颜色/背景色) 文字颜色/背景色
    30/40
    31/41
    32/42 绿
    33/43
    34/44
    35/45 红紫
    36/46 蓝绿
    37/47
  5. 显示出现频率较高的top 10个字符串,如访问源IP

    awk '{print $1}' access_log | sort | uniq -c | sort -nr | head -10

    注意uniq的去重统计是按照相邻行计算的,只走一遍,所以需要在uniq -c之前先进行sort按字符顺序进行排序。

  6. 条件筛选-根据URL请求计算疑似非法访问的日志数量

    awk '$9 !~ /200|304/{print $9,$7}' access_log |sort| uniq -c | sort -nr

    $9 !~ /模式/表示筛选掉$9中满足该模式的字符串

示例3-同时处理两个文件

awk 'pattern' file1 file2

在awk里,NR和FNR的含义相近,唯一的区别就是作用范围,NR是所有读取的行信息计数,而FNR是正在读取文件的行信息技术,FNR在文件切换时会从0重新开始计数,所以在awk语句中:

  • NR==FNR在判断是不是在读file1;
  • NR>FNR则判断是不是在读file2.

awk求两个文件的交集(有相同字段的行)

awk -F'\t' 'NR==FNR{cat[$1]=1}NR>FNR{if($1 in cat){print $0}else{}}' file1 file2

代码的含义是首先处理file1时NR==FNR,执行cat[$1]=1,表示创建一个cat词典,当处理file2时,判断file2中的行是否在cat字典中,并进行print $0(一整行)

awk按照奇数行和偶数行进行处理

使用NR或FNR进行判断,awk '{if (NR%2==1) print $0}' file

输出第一列和第7列相同内容的行

awk -F'\t' '{ if($1==$7){print $0} }' in.txt > out.txt

输出第一列和第7列除去空格后相同内容的行

需要对两列使用gsub函数去除空格然后比较。注意两点:

  1. 空格分半角' '和全角' ',两者不等同。
  2. print ori不要写成print $ori, 后者等同于print $0, 由于gsub改变了$1$7的值,所以$0的结果是被去除了空格。

    awk -F'\t' '{ ori=$0; gsub(/ /, "", $1);gsub(/ /, "", $7);if($1==$7){print ori} }' ./in

管道-命令结合

tail -n +2 file | awk '{print $1*$2}' #表示输出file中从第二行开始到结束的行,跳过首行的描述信息或注释等

tr -d ',-' < file | sed 's/^.../&-' #将file中的逗号与连字符删掉后在每行前三个字符与后边字符之间加上连字符

echo {1..10} | tr ' ' '\n' | awk '{print $1*2}' | xargs #xargs将多行的数据转成了单行,输出:2 4 6 8 10 12 14 16 18 20

执行单个awk脚本与用管道进行多个awk串联的比较

使用管道将多个命令串起来将整个任务分解开来无疑更容易理解处理思路,并且利用多CPU并行工作还可提高效率。

如下操作,对数字进行替换,两种方式的执行时间比较:

time seq 1 10000000 | sed -e 's/1/one/g' -e 's/0/zero/g' > /dev/null

V.S.

time seq 1 10000000 | sed 's/1/one/g' | sed 's/0/zero/g' > /dev/null

gawk进行正则表达式字符串提取

gawk 是 AWK 的 GNU 版本。gawk可能没有预装在系统中,需要额外安装。

用法:gawk 'match($0, pattern, ary) {print ary[1]}'

例子:

echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}'

其中,a[1]表示括号中匹配的结果.

将a[1]替换成ary['${2:-'0'}']可以匹配整个字符串

输出: cd.

可以写成一个shell函数,方便调用:

function regex { gawk 'match($0,/'$1'/, ary) {print ary['${2:-'0'}']}'; }

使用: echo "abcdef" | regex 'b.*f'

sed、awk命令速查的更多相关文章

  1. awk命令速查

    awk与sed.grep一样都是为了加工数据流而做成的文本加工过滤器命令.awk会事先把输入的数据根据字段单位进行分割.在没有制定分割单位的情况下,以输入数据中的空格或Tab为分隔符.与sed相比,它 ...

  2. Linux常用命令速查备忘

    Linux常用命令速查备忘   PS:备忘而已,详细的命令参数说明自己man 一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown ...

  3. 简明 Git 命令速查表(中文版)

    原文引用地址:https://github.com/flyhigher139/Git-Cheat-Sheet/blob/master/Git%20Cheat%20Sheet-Zh.md在Github上 ...

  4. Linux命令速查手册,超详细Linux命令教程

    一.常用命令速查 ls cd pwd cat more less tail head cp scp mv mkdir rmdir touch rm ps kill top free clear tre ...

  5. 转收藏:Git常用命令速查表

    一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...

  6. Redis常用命令速查 02_转

    一.Key Key命令速查: 命令 说明 DEL 删除给定的一个或多个 key,不存在的 key 会被忽略,返回值:被删除 key 的数量 DUMP 序列化给定 key,返回被序列化的值,使用 RES ...

  7. Git 命令速查表

    Git 命令速查表 1.常用的Git命令 命令 简要说明 git add 添加至暂存区 git add-interactive 交互式添加 git apply 应用补丁 git am 应用邮件格式补丁 ...

  8. Git 常用命令速查表(图文+表格)

    一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...

  9. Linux常用命令速查-汇总篇

    Linux常用命令速查-用户管理 Linux常用命令速查-文件管理 Linux常用命令速查-系统监控 Linux常用命令速查-网络管理 Linux常用命令速查-定时任务 Linux常用命令速查-Vim

随机推荐

  1. Java线程synchronized(一)

    线程安全概念:当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. synchronized:可以在任意对象及方法上加锁,而加锁的这段代码 ...

  2. Install Gnome desktop

    Install Gnome desktop http://www.dinggd.com/index.php/freebsd-8-0-rc1-gnome%E6%A1%8C%E9%9D%A2%E5%AE% ...

  3. 【面试突击】- Mybatis-#{}和${}的区别

    原文链接:mybatis中#{}和${}的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时 ...

  4. 通过Git和GitHub项目管理

    用Git来管理代码文件 安装环境 windows 首先是安装git: 1.到git官网下载一个安装包 2.安装git,详细过程略 3.打开项目文件夹,并鼠标右击,打开git bash 4.从未使用过g ...

  5. 【zookeeper】linux中编写脚本批量启动zookeeper

    实现功能:一键启动.关闭主从端3个节点上的zookeeper,附加查看启动状态 mkdir bin --新建文件夹 cd bin 跳转到bin文件夹里 touch zookeeperstart.sh ...

  6. WebSocket转载

    目录   概述  WebSocket 客户端  WebSocket 服务端  WebSocket 代理  FAQ  完整示例  资料 概述 WebSocket 是什么? WebSocket 是一种网络 ...

  7. SQL SERVER-Extendevent系统视图

    --获得扩展事件的事件 select name,description from sys.dm_xe_objects where object_type='event' order by name - ...

  8. SQL SERVER-解析Extendevent文件数据

    --解析xel数据 select SWITCHOFFSET(n.value('@timestamp','Datetime'),'+08:00') as EventTime, n.value('(dat ...

  9. SQL SERVER-修改TempDB路径

    --查看tempdb文件信息 use tempdb go sp_helpfile go --修改路径 use master go Alter database tempdb modify file ( ...

  10. python两则99乘法表

    分别应用while和for的嵌套循环,适用于初学的人看看 x = 1 while x <= 9: y = 1 while y <= x: print (y,'*',x,'=',x*y,en ...