文本处理三剑客之gawk
gawk
作者:Aho, Weinberger, Kernighan
版本:
- GNU awk:gawk
- New awk:nawk
简介:格式化文本输出工具,模式扫描及处理语言;报告生成器。
用法:gawk [ options ] ' PATTERN { ACTION STATEMENTS }' FILE ...
gawk [options] 'program' FILE ...
program : PATTERN{ACTION STATEMENTS}
1、选项(options)
1.1:-f file:指定awk脚本文件
1.2:-F : 输入数据时的字段分隔符
1.3:-v var=value :自定义变量
2、PATTERN
1)空模式,匹配每一行
2)/正则表达式/:仅处理被模式匹配到的行
3)关系表示式(条件表示式):布尔值类型,结果为真(非0或非空字符串)则处理;结果为假(0或空字符串)则不处理
4)地址定界;支持PATTERN和条件表达式;不支持数字直接定界
5)BEGIN/END模式;BEGIN{}:仅在文本处理之前执行;END{}:仅在文本处理完成之后执行
3、ACTIONS
3.1、表达式
1)三目表达式:selector?if-true-expression:if-false-expression
如果selector为真,则执行if-true-expression;如果selector为假,则执行if-false-expression。
3.2、控制语句
1)if-else 语法:if(condition) statement [else statement]
2)while 语法:while(condition) statement 条件真进入循环,条件假退出循环
3)do-while 语法:do statement while(condittion) 先执行一次do,然后判断是否进入循环
4)for 语法:for(variable assignment; condition; iteration process){for-body}
*特殊用法:能够遍历数组中的元素,for(var in array) {for-body}
5)switch 语法:switch(expression) {case VALUE1 or /PEGEXP/: statement; case VALUE2 or /PEGEXP2/: statement; ... ;default: statement}
6)next:控制awk的内生循环,提前结束对本行的处理直接进入下一行
7)continue | break | exit:退出循环,和shell中用法相同
3.3、组合语句
1)组合语句需要将多条语句放到大括号内
3.4、输入语句
3.5、输出语句
3.5.1、print item1, item2, ... 输出命令
1)逗号为分隔符
2)输出的各item可以是字符串,也可是数值当前记录字段、变量或awk的表达式
3)如果省略item,则相当于print $0
3.5.2、printf FORMAT, item1, item2, ...:格式化输出命令
1)FORMAT必须要给出
2)不会自动换行,需要显示给出换行控制符,\n
3)FORMAT中需要分别为后面的每个item指定一个格式化符号
4)格式符
- %c:显示字符的ASCII码;
- %d,%i:显示十进制整数;
- %e,%E:科学计数法数值显示;
- %f:显示为浮点数;
- %g,%G:以科学技术法或浮点数形式显示数值;
- %s:显示字符串;
- %u:无符号整数;
- %%:显示%自身
5)修饰符
- M[.N]:M控制数组显示的宽度,N控制小数点的精度
- -:左对齐显示,默认右对齐
- +:显示数值的符号
4、变量
4.1、内建变量
FS:输入字段分隔符,默认为空白字符
OFS:输出字段分隔符,默认为空白字符
RS:输入记录分隔符
ORS:输出记录分隔符
NF:字段数量;{print $NF}:表示最后字段值
NR:行数,对不同文件行数累加计数
FNR:行数,对不同文件行数分别计数
FILENAME:显示当前文件名
ARGC:命令行参数个数
ARGV:数组,保存的是命令行中给定的各参数,使用ARGV[#]引用
4.2、自定义变量
1)-v var=value 在选项中定义
2)在program中直接定义
5、数组
关联数组:array[index-expression]
index-expression:
1)可以使用任意字符,字符串要使用双引号;
2)如果某数组元素事先不存在,在引用时awk会自动创建此元素并将其值初始化为“空串”;若要判断数组中是否存在某元素,需要使用"index in array"格式进行;
delete array[index]:删除数组中的单个元素
delete array:删除整个数组
6、函数
6.1、内置函数
srand():生成随机数种子
rand():返回1和0之间的随机数(小数)
int():对数取整
length():返回指定字符串的长度
sub(r, s, [t]):以r表示的模式来查找t所表示的字符串所匹配的内容,并将其第一次出现的替换为s所指定的内容
gsub(r, s, [t]):以r表示的模式来查找t所表示的字符串所匹配的内容,并将其所有出现的替换为s所指定的内容
split(s, a, [r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中
system():在awk中调用shell命令,shell命令需要用双引号引起来,awk变量一定不能被双引号引起来
6.2、自定义函数
function name ( parameter1, parameter2, ... ) {
statements
return expression
}
7、awk中的操作符
7.1、算术操作符:
- + - * / ^ %
- -x:整数转换为负数
- +x:字符串转换为数值
7.2、赋值操作符:
- = += -= /= %= ^= ++ --
7.3、比较操作符:
- > < >= <= != ==
7.4、模式匹配符:
- ~:左侧的字符串是否能够被右侧的模式匹配
- !~:左侧的字符串是否能够被右侧的模式不匹配
7.5、逻辑操作符:
- && (并且)
- || (或者)
- ! (否)
8、awk脚本
格式:
#!/bin/awk -f
#this is a awk test script
{ACTION STATEMENTS}
调用:
test.awk /path/file
awk用法示例:
1、从passwd文件中取出user,uid,shell
~]# awk -F: '{print $1,$3,$7}' /etc/passwd
~]# awk -v FS=":" '{print $1,$3,$7}' /etc/passwd
2、从passwd文件中取出user,uid,shell并且以":"为分隔符输出
~]# awk -v FS=":" -v OFS=":" '{print $1,$3,$7}' /etc/passwd
3、以空格为换行符输出
~]# awk -v RS=' ' '{print}' /etc/passwd
4、输出每行有多少个字段
~]# awk '{print NF}' /etc/passwd
5、输出文件行号(有多少行)
~]# awk '{print NR}' /etc/passwd
6、俩个文件分别打印行号
~]# awk -F: '{print FNR}' /etc/passwd /etc/fstab
7、打印命令行有几个参数
~]# awk -F: 'BEGIN{print ARGC}' /etc/passwd /etc/fstab
8、打印命令行第1个参数
~]# awk -F: 'BEGIN{print ARGV[1]}' /etc/passwd /etc/fstab
9、自定义变量,打印hello world
~]# awk -v var='hello world!' 'BEGIN{print var}'
10、格式化输出username,UID,shell类型
~]# awk -F: '{printf "Username:%-15s--Uid:%-4d--Shell:%s\n",$1,$3,$NF}' /etc/passwd
11、三目表达式来判断系统用户和普通用户
~]# awk -F: '{$3>=1000?usertype="Common":usertype="Sysuser"; printf "%20s:%s\n",$1,usertype}' /etc/passwd
12、查看fstab文件中的UUID
~]# awk '/^UUID/{print $1}' /etc/fstab
13、查看passwd文件中UID大于1000的用户
~]# awk -F: '$3>=1000{print $1}' /etc/passwd
14、查看shell为bash的用户
~]# awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd
~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
15、显示行首为从root到sshd的行
~]# awk '/^root/,/^sshd/{print $0}' /etc/passwd
16、指定显示从第三行到第十行
~]# awk '(NR>=3&&NR<=10){print $0}' /etc/passwd
17、打印表头和表尾,格式化输出
~]# awk -F: 'BEGIN{print " username uid \n------------------------"}{printf "%13s:%8d\n",$1,$3}END{print "==========end========="}' /etc/passwd
18、用if判断uid是否大于1000
~]# awk -F: '{if($3>=1000){print $1,$3}}' /etc/passwd
19、用双分支if语句输出用户的类型
~]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "system user: %s\n",$1}}' /etc/passwd
20、打印大于5个字段的行
~]# awk '{if(NF>5){print $0}}' /etc/fstab
21、显示系统上磁盘的使用率超过20%的分区
~]# df |awk -F% '/^\/dev\/sd/{print $1}' |awk '{if($NF>20){print $1,$NF}}'
22、统计grub.cfg文件中以linux16开头的行的所有字段长度
~]# awk '/^[[:space:]]*linux16/{i=1; while(i<=NF){print $i,length($i); i++}}' /boot/grub2/grub.cfg
23、统计grub.cfg文件中以linux16开头的行的所有字段长度的长度大于等于7的字段
~]# awk '/^[[:space:]]*linux16/{i=1; while(i<=NF){if(length($i)>=7) {print $i,length($i)}; i++}}' /boot/grub2/grub.cfg
~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++){if(length($i)>=7) {print $i,length($i)}}}' /boot/grub2/grub.cfg
24、打印UID为偶数的用户
~]# awk -F: '{if($3%2) next; print $1,$3}' /etc/passwd
25、统计tcp的连接状态
~]# ss -tan |awk '{state[$1]++}END{for(i in state){print i,state[i]}}'
26、统计httpd的日志,统计访问的ip
~# awk '{ip[$1]++}END{for(i in ip){printf "%20s:%d\n",i,ip[i]}}' /var/log/httpd/access_log
27、统计tcp连接客户端IP地址
~]# netstat -tan |awk '/^tcp\>/{split($5,ip,":"); count[ip[1]]++}END{for(i in count) {print i,count[i]}}'
个人学习笔记,记录于2018.5.15 19:14
文本处理三剑客之gawk的更多相关文章
- Linux文本处理三剑客之grep及正则表达式详解
Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...
- Linux文本处理三剑客之——grep
一Linux文本处理三剑客之——grep Linux文本处理三剑客都支持正则表达式 grep :文本过滤( 模式:pattern) 工具,包括grep, egrep, fgrep (不支持正则表达式) ...
- Linux 文本处理三剑客之grep
文本处理都要使用正则表达式,正则表达式有: 基本正则表达式:grep或者egrep -G 扩展正则表达式:egreo或者grep -E Linux 文本处理三剑客: sed:stream editor ...
- 文本处理三剑客之sed命令
第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...
- 文本处理三剑客之 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. ...
- shell脚本之正则表达和文本处理(文本处理三剑客:1、grep 2、sed 3、awk)
文本处理三剑客:1.grep 2.sed 3.awk 一.grep:(过滤) grep的使用,主要的参数有: -n :显示行号:-o :只显示匹配的内容-q :静默模式,没有任何输出,得用e ...
- Linux文本处理三剑客之sed
推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...
- 关于Linux文本处理“三剑客”的一些小操作。
Linux文本处理“三剑客”,即grep.sed.awk,这是Linux中最核心 的3个命令. 一.首先做个简单的介绍: 1.awk:linux三剑客老大,过滤,输出内容,一门语言.NR代表行号. 2 ...
随机推荐
- codeforces 612D The Union of k-Segments (线段排序)
D. The Union of k-Segments time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- C++如何拒绝编译器自动生成的函数
每一个class,编译器都会自动生成四个特殊成员函数: destructor(析构函数) default constructor(默认构造函数) copy constructor(copy构造函数) ...
- 不要试图用msvc来编译ffmpeg
出于学习目的,想建一个vs2010工程来编译ffmpeg(http://www.ffmpeg.org/),但是由于意义不大,并且工作量太大放弃了.原因如下: 1.一些unix平台相关的头文件.库的依赖 ...
- Winform程序实现多显示屏、多屏幕显示的2种方法
这篇文章主要介绍了Winform窗口实现多显示屏显示的2种方法,本文直接给出了实现代码,并对其中的一些重要参数做了解释,需要的朋友可以参考下. 一台主机连接了2台显示器(2个显卡),要求一个程序的两个 ...
- unittest ,ddt数据驱动,读取文件中数据,多个参数时的处理
1. test.yaml中的数据 这里的属性是list 2.创建用例 3,在yaml中创建数据,创建list数据,list中再创建dict数据,这样就可以读取dict中的多个参数的数据了
- stm32 奇怪的位赋值问题 出错了
转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6094215 1.在51单片机里 ,下面这两种操作方法都是一样的,没有什么问题! ...
- docker-machine create --driver virtualbox myvm1 创建失败
1. 问题描述 docker-machine create --driver virtualbox myvm1 安装完 virtualbox 后,无法创建. 输出内容为: Running pre-cr ...
- 问题:C# params类型参数;结果:C#的参数类型:params、out和ref
C#的参数类型:params.out和ref PS:由于水平有限,难免会有错误和遗漏,欢迎各位看官批评和指正,谢谢~ 首先回顾一下C#声明一个方法的语法和各项元素,[]代表可选 [访问修饰符] 返回值 ...
- shell入门-awk-2
awk的条件操作符 ///显示第一段有root的行 [root@wangshaojun ~]# awk -F ':' '$1=="root"' 1.txtroot:x:0:0:ro ...
- 11、perl语言的记录分割符$/ $\
参考:https://www.jianshu.com/p/8ffd53b1bd41 perl自带的perldoc文档.perldoc -v '$/' :perldoc -f join $/ #输入记 ...