文本处理三剑客之 awk
GAWK:报告生成器,格式化文本输出
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
awk程序组成部分:
BEGIN语句块、能够使用模式匹配的通用语句块、END语句块
选项:
-F:指明输入时用到的字段分割符;
-v var=value:自定义变量
-f:指定awk脚本,从脚本中读取program
基本格式:
awk [options] 'program' file...
program:pattern{action statements;...} 通常在单引号或双引号中;
pattern与action:
pattern部分决定动作语句何时触发及事件
BEGIN:模式匹配之前要执行的动作
END:模式匹配结束之后要执行的动作
action statements对数据进行处理,放在{}内指明;
print $0,$!.......$(NF-1)........$NF(最后一列)
分隔符,域,记录:
awk执行时,由分隔符分隔的字段(域)标记$1,$2...$n称为域标识。$0为所有域。
文件的每一行称为记录;
省略action,则默认执行print $0的操作;
awk的工作原理:
1)、执行BEGIN{action;...}语句块中的语句;
2)、从文件或标准输入(stdin)读取一行,然后执行pattern{action;...}语句块,它会逐行扫描文件,从第一行到最后一行重复这个过程,知道文件被全部读取完毕;
3)、当读至输入流末尾时,执行END{action;...}语句块
BEGIN语句块:在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常 可以写在BEGIN语句块中。
END语句块:在awk从输入流中读取完所有的行之后即被执行,比如 打印所有行的分析结果这类信息汇总都是在END语句块中完成它也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果 没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
print格式:print item1,item2,...
1)、逗号为分隔符;
2)、输出的个item可以是字符串,也可以是当前记录的字段、变量或awk的表达式;
3)、如省略item,相当于print $0;
awk '{print "hello,awk"}'
awk –F: '{print}' /etc/passwd # -F指定分割符为 :冒号
awk –F: '{print “wang”}' /etc/passwd
awk –F: '{print $}' /etc/passwd
awk –F: '{print $}' /etc/passwd
awk –F: '{print $”\t”$}' /etc/passwd
tail – /etc/fstab |awk '{print $,$}'
变量:
FS:输入字段分隔符,默认为空白字符;
awk -v FS=':' '{print $1,FS,$3}' file
OFS:输出字段分隔符,默认为空白字符;指定输出时的分隔符是什么,一般可以进行分隔符号替换,类似下面的ORS的作用
awk -v FS=':' -v OFS=':' '{print $1,$2,$3}' file
[root@mysql-141 ~]# awk -v FS=':' -v OFS='#' '{print $1,$2,$3}' /etc/passwd
root#x#0
bin#x#1
daemon#x#2
adm#x#3
RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效;
awk -v RS=' ' '{print}' file
ORS:输出记录分隔符,输出时用指定符号代替换行符;
awk -v RS=' ' -v ORS='$$$' '{print}' file
NF:字段数量
awk -F: '{print NF}' file
awk -F: '{print $(NF-1)}' file
# 显示文件的第一列,第三列,倒数第二列和最后一列
[root@mysql-141 ~]# awk -F : '{print $1,$2,$(NF-1),$NF}' /etc/passwd
root x /root /bin/bash
bin x /bin /sbin/nologin
daemon x /sbin /sbin/nologin
adm x /var/adm /sbin/nologin
NR:行号
awk -F: '{print NR,$1}' file # 与FNR类似
awk END'{print NR}' file
[root@mysql-141 ~]# awk END'{print NR}' /etc/passwd #将文件内容读取完成之后,统计行数
26
awk 'NR==2,NR==6{print NR,$0}}' file #显示文件2-6行
FNR:各文件的行号分别计数;
awk -F: '{print FNR,$1}' file1 file2...
[root@mysql-141 ~]# awk -F: '{print FNR,$1}' /etc/passwd
1 root
2 bin
3 daemon
4 adm
5 lp
6 sync
7 shutdown
8 halt
FILENAME:当前文件名;文件内容有多少行,awk就会输出多少行
awk '{print FILENAME}' FILE1 FILE2...
[root@mysql-141 ~]# awk '{print FILENAME}' /etc/passwd |wc -l
26
[root@mysql-141 ~]# wc -l /etc/passwd
26 /etc/passwd
ARGV:数组,保存的是命令行所给定的各参数;
awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab
[root@mysql-141 ~]# awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab # 相当于shell里面的$1 $2 $3 的概念
/etc/fstab
[root@mysql-141 ~]# awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/inittab
/etc/inittab
[root@mysql-141 ~]# awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
awk
[root@mysql-141 ~]# awk 'BEGIN {print ARGV[3]}' /etc/fstab /etc/inittab
算术操作符:
x+y x-y x*y x/y x^y x%y
-x:转换为负数;
+x:转换为数值,变量通过+连接运算,自动强制将字符串转为整形,非数字变成0,发现第一个非数字字符,后面的自动忽略;
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
= += -= *= /= %= ^= ++ --
比较操作符:
== != > >= < <=
模式匹配符:
~:左边的内容是否被右边的模式包含匹配
!~:是否不匹配;
[root@mysql-141 ~]# awk -F: '$0 ~ /root/{print $1}' /etc/passwd # 以:为分隔符,匹配全部内容包含root的行,打印第一列
root
operator
[root@mysql-141 ~]# awk '$0 ~ "^root"' /etc/passwd # 匹配所有内容,期初以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@mysql-141 ~]# awk -F: '$3==0' /etc/passwd # 匹配以冒号为分隔符,第三列是0的行
root:x:0:0:root:/root:/bin/bash
cat >>/tmp/reg.txt<<EOF
Zhang Dandan :::
Zhang Xiaoyu :::
Meng Feixue :::
Wu Waiwai :::
Liu Bingbing :::
Wang Xiaoai :::
Zi Gege :::
Li Youjiu :::
Lao Nanhai :::
EOF
操作符:
与&&
或||
非!
示例:
[root@mysql-141 ~]# awk -F : '$3>=0 && $3<=1000 {print $1}' /etc/passwd
root
bin
daemon
adm
lp
[root@mysql-141 ~]# awk -F : '$3==0 || $3>=1000 {print $1}' /etc/passwd
root
[root@mysql-141 ~]# awk -F : '!($3==0) {print $1}' /etc/passwd
bin
daemon
adm
lp
[root@mysql-141 ~]# awk -F : '!($3>=500) {print $3}' /etc/passwd
0
1
2
3
4
5
6
awk PATTERN:
1)、如果未指定:空模式,匹配每一行;
2)、/regular expression/:仅处理能够被模式匹配到的行,需要用//括起来;
awk '/^UUID/{print $1}' /etc/passwd
awk '!/^UUID/{print $1}' /etc/passwd
3)、relational expression:关系表达式,结果未"真"才会被处理;
真:结果为非0值,非空字符串;
假:结果为空字符串或0值;
awk -F : 'i=1;j=1{print i,j}' /etc/passwd
awk '!0' /etc/passwd ; awk '!1' /etc/passwd
awk –F : '$3>=1000{print $1,$3}' /etc/passwd
awk -F : '$3<1000{print $1,$3}' /etc/passwd
[root@mysql-141 ~]# awk -F : '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
lipeng /bin/bash
[root@mysql-141 ~]# awk -F : '$NF ~ /nologin$/{print $1,$NF}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
mail /sbin/nologin
uucp /sbin/nologin
4)、line ranges:行范围:
startline,endine:/pat1/,/pat2/ 不支持直接给出数字格式:
[root@mysql- ~]# awk -F: '/^root\>/,/^nobody\>/{print $1}' /etc/passwd
root
bin
daemon
adm
lp
nobody
[root@mysql- ~]# awk -F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
uucp
operator
games
gopher
ftp
awk数组概念:
预备知识: 了解两种awk运算方法
1) 累加运算 1+1+1
i=i+1 i初始状态为0
i++
eg: 统计/etc/services文件中空行数量
第一个里程: 找出文件中空行信息
awk '/^$/' /etc/services
第二个里程: 统计空行数量
awk '/^$/{i=i+1;print i}' /etc/services
PS: awk中所有字符串信息都会识别为变量名称信息, 调取变量是不需要加上$符号
awk中想显示指定字符串信息, 需要在字符串外面加上双引号信息
[root@oldgirl ~]# awk '/^$/{i=i+1;print i}' /etc/services
1 # i=i+ i= i=+ --> i=
# i=i+ i= i=+ --> i=
# i= i=+ --> i= 16 [root@oldgirl ~]# awk '/^$/{i=i+1}END{print i}' /etc/services # 将文件内容加载完之后,做出统计
2) 求和运算 10+20+5
i=i+$n i的初始状态为0 $n取第几列数值信息
[root@oldgirl ~]# seq |awk '{i=i+$0;print i}'
i=i+$ i= $= i=+ --
i=i+$ i= $= i=+ --
i=i+$ i= $= i=+ -- 55
[root@mysql-141 ~]# seq 10|awk '{i=i+$0;print i}'
1
3
6
10
15
21
28
36
45
55
3). 数组的表现形式
数组中的括号里面的内容
hotel[元素01]=xiaolizi1 --- 调用print xiaolizi1[元素01]--- xiaolizi1
hotel[元素02]=xiaolizi2 --- 调用print xiaolizi2[元素02]--- xiaolizi2
数组统计命令组成说明:
1) 找出要统计的信息
$1
2) 把指定要统计信息作为数组的元素
h[$1]
3) 利用统计运算公式,进行运算
h[$1]=h[$1]+1 --- i=i+1
4) 显示运算的结果信息
a 只看某一个元素的结果信息
awk '{h[$1]=h[$1]+1}END{print h["101.226.61.184"]}' access.log
b 要看全部元素的结果信息
awk '{h[$1]=h[$1]+1}END{print h["101.226.61.184"],h["114.94.29.165"]}' access.log
# 精简后命令
awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log
for name in 101.226.61.184 114.94.29.165
print h[$name]
==>
for(name in h) --- > echo name=h=第一个元素信息
echo name=h=第二个元素信息
说明: 循环中读取数组名称==读取每一个元素名称信息
cat >>url.txt<<EOF
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
EOF
awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log
[root@mysql-141 ~]# awk '{h[$1]++}END{for(name in h)print name,h[name]}' access.log
101.226.61.184 5
27.154.190.158 2
218.79.64.76 2
114.94.29.165 1
第一步: 定义数组信息
awk '{h[$1]}' access.log
说明: 数组中的元素就是你关注要统计的列的信息 第二步: 进行统计运算,编写公式
awk '{h[$1]=h[$1]+1}' access.log 第三步: 编写元素循环信息
awk '{h[$1]=h[$1]+1}END{for(name in h)}' access.log 第四步: 输出结果信息
awk '{h[$1]=h[$1]+1}END{for(name in h) print name,h[name]}' access.log
将文本内容格式化输出
原文如下:
job_name job_group
syncCommStockJob dataSync
syncStoreChnlJob dataSync
syncOrderJob dataSync
syncReportStoreJob dataSync
hdfsScanJob report
orderSaleDailyJob report
jdzmdOrdersJob report
jdCanJob report
使用awk格式化输出后
cat xxx.txt | awk '{printf "%-30s%-15s\n",$1,$2}'
#%-30s表示输出字符串,宽度30位(字符串如果过长,可以自己调整),左对齐.%-15s用来指定第二列的,左对齐,宽度15.两个百分号之间可以没有空格.使用\n对每一行的输出加上换行符 job_name job_group
syncCommStockJob dataSync
syncStoreChnlJob dataSync
syncOrderJob dataSync
syncReportStoreJob dataSync
hdfsScanJob report
文本处理三剑客之 awk的更多相关文章
- 文本处理三剑客之AWK的用法
1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...
- 文本处理三剑客之awk
简介 awk是一种处理文本文件的语言,是一个强大的文本编辑工具.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理. gawk 用法:gawk [optio ...
- 文本处理三剑客之awk(No.1)
示例1:只查看test.txt文件内的第3到第7行的内容 awk '{if(NR>=3 && NR<=7) print $0}' test.txt #其中的$0是输出整个行 ...
- shell脚本之正则表达和文本处理(文本处理三剑客:1、grep 2、sed 3、awk)
文本处理三剑客:1.grep 2.sed 3.awk 一.grep:(过滤) grep的使用,主要的参数有: -n :显示行号:-o :只显示匹配的内容-q :静默模式,没有任何输出,得用e ...
- Linux实战教学笔记18:linux三剑客之awk精讲
Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...
- 文本处理三剑客之 Sed ——一般编辑命令
sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...
- 文本处理三剑客之 grep
grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...
- (转)不看绝对后悔的Linux三剑客之awk实战精讲
原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...
- Linux文本处理三剑客之grep及正则表达式详解
Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...
随机推荐
- Java 实验案例(多态)
实验任务 任务一:图形面积周长计算小程序 任务二:饲养员喂养动物程序 实验内容: 任务一: 图形面积周长计算 任务目的: 掌握多态的含义及应用场合 掌握上转型对象和多态的实现 掌握abstract关键 ...
- 专访阿里资深研发工程师窦贤明:PG与商业数据库差距并不明显
窦贤明认为, 支持类型.功能和语法丰富,性能优良 9月24日,窦贤明将参加在北京举办的线下活动,并做主题为<Greenplum分片案例分析>的分享.值此,他分享了PG.工作上的一些经历 ...
- io流中read方法使用不当导致运行异常的一点
public class CopyMp3test { public static void main(String[] args) throws IOException { FileInputStre ...
- Oracle Sequence Cache 参数说明
转自 http://blog.csdn.net/tianlesoftware/article/details/5995051 之前整理的一篇文章: ORACLE SEQUENCE 介绍 http:// ...
- 初识oracle重做日志文件
转自 http://blog.csdn.net/indexman/article/details/7746948 以下易容翻译自oracle dba官方文档,不足之处还望指出. 管理重做日志文件 学习 ...
- 【转】ubuntu右键在当前位置打开终端
ubuntu右键在当前位置打开终端 ubuntu增加右键命令: 在终端中打开 软件中心: 搜索nautilus-open-terminal安装 命令行: sudo apt-ge ...
- zabbix系列之八——安装后配置三Triggers
1Triggers(触发器) 描述 详细 备注 术语描述 1)触发器是评估监控项采集的数据的逻辑表达式,代表了当前系统状态. 2)触发器可定义一个什么数据是可接受的阈值,因此,如果接收的数据超过了可接 ...
- Elasticsearch安装记录
一 安装部分 1.新建用户 elasticsearch不能使用root身份执行 adduser esuser passwd esuser 2.赋予权限 切换到root chown -R esuser ...
- spring mvc 解决跨域问题
Spring MVC 从4.2版本开始增加了对CORS的支持. 在Controller上使用@CrossOrigin注解: // 指定域名 @CrossOrigin("http://doma ...
- [翻译] RAReorderableLayout
RAReorderableLayout A UICollectionView layout which you can move items with drag and drop. 一种UIColle ...