awk命令之进阶篇

内置函数

数学函数

atan2(y,x) 计算y/x的反正切
cos(x) 计算x的余弦;x是弧度
sin(x) 计算x的正弦;x是弧度
exp(x) 计算e的x幂
log(x) 计算x的自然对数
sqrt(x) 计算x平方根
int(x) 计算x的截断至整数的值
rand() 返回一个随机数,范围0~1,小于1
srand(x) 设置rand函数的种子值,省略参数则使用时间作为参数。返回先前的种子值
awk'BEGIN{printexp(1)}'
2.71828
awk'BEGIN{printsqrt(25)}'
5
awk'BEGIN{printlog(exp(1))}'
1
awk'BEGIN{printint(5.5)}'
5
没有使用srand时,rand的随机数每次都一样
awk'BEGIN{printrand()}'
0.237788
awk'BEGIN{printrand()}'
0.237788
使用srand后,每次都不一样
awk'BEGIN{srand();printrand()}'
0.110823
awk'BEGIN{srand();printrand()}'
0.681478

字符串函数

gsub(pattern,des,src) 由des替换src所有被pattern匹配的字符串
sub(pattern,des,src) 用des替换src中被pattern匹配的第一个字符串。函数返回替换的数量。如果未指定src参数,缺省值是整个记录($0)
index(str1,Str2) str2中的字符串出现在str1中的从1开始的位置。若没有则返回0
length(str) 返回str参数指定的字符串的长度(字符形式)。如果未给出str参数,则返回整个记录的长度($0)
substr(str,ptr,n) 返回字符串s中从ptr开始长度为n的字符串,如果未指定n,则返回ptr指定的位置到str参数的末尾的字符串
match(str,pattern) 返回在str中匹配pattern的开始位置,并设置RLENGTH变量为匹配个数。无匹配时RLENGTH为-1
split(str,array,[pattern]) 将str字符串以pattern为分隔符,分割并存在array数组内。省略pattern时使用默认分隔符
tolower(str) 返回str参数指定的字符串,字符串中每个大写字符将更改为小写
toupper(str) 返回str参数指定的字符串,字符串中每个小写字符将更改为大写
sprintf(format,expr,expr,...) 字符串格式化函数,返回格式化后的字符串
cat tmp.txt
str strstr str

awk '{sub(/str/,"123");print $0}' tmp.txt
123ing strstr str
awk '{gsub(/str/,"123");print $0}' tmp.txt
123ing 123ing123ing 123ing
awk 'BEGIN{print index("1234","23")}'
2
awk 'BEGIN{print length("1234")}'
4
$awk 'BEGIN{print substr("1234",2,2)}'
23
awk 'BEGIN{print substr("1234",2)}'
234
awk 'BEGIN{print match("abcd",/cd/);print RLENGTH}'
3
2
awk 'BEGIN{print match("abcd",/e/);print RLENGTH}'
0
$awk 'BEGIN {split("123;456;789",array,/;/);i=0;for(i in array)print array[i]}'
123
456
789
awk 'BEGIN {print toupper("string");}'
STRING
awk 'BEGIN {print tolower("STRING");}'
string
awk 'BEGIN {a=1;b="string";print sprintf("hello %d hello %s",a,b);}'
hello 1 hello string

其他函数

close(filenameORcommand) 关闭打开的文件或管道。成功,则返回 0;其它情况下返回非零值
system(command ) 执行command参数指定的命令,并返回退出状态。等同于 system 子例程
expression | getline [ variable ] 将expression命令的输出通过管道读入variable,如果当前未打开将 expression管道,则创建管道且是只读管道。只要管道保持打开,则对 getline 函数的每次调用都会读取下一行记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量
getline [ variable ] < filename 从 filename 指定的文件读取下一个记录,并存在 variable 内。只要输入流保持打开且 filename 参数对同一个字符串求值,则对 getline 函数的每次调用都会读取下一行记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量
getline [ variable ] 将 variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量
awk 'BEGIN{system("cat tmp.txt")}'
string stringstring string
awk 'BEGIN {"cat ~/tmp.txt"  | getline;print $0;close("cat ~/tmp.txt");}'
string stringstring string
awk 'BEGIN {getline a< "tmp.txt";print a;close("tmp.txt");}'
string stringstring string
mktime("YYYY MM DD HH MM SS") 生成时间格式
strftime([format [, timestamp]]) 格式化时间输出,将时间戳转为时间字符串 
systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
awk 'BEGIN{last=mktime("2012 01 02 03 04 05");print strftime("%Y %m %d %H %M %S",last)}'
2012 01 02 03 04 05
格式 描述
%a 星期几的缩写(Sun)
%A 星期几的完整写法(Sunday)
%b 月名的缩写(Oct)
%B 月名的完整写法(October)
%c 本地日期和时间
%d 十进制日期
%D 日期 08/20/99
%e 日期,如果只有一位会补上一个空格
%H 用十进制表示24小时格式的小时
%I 用十进制表示12小时格式的小时
%j 从1月1日起一年中的第几天
%m 十进制表示的月份
%M 十进制表示的分钟
%S 十进制表示的秒
%U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
%w 十进制表示的星期几(星期天是0)
%W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)
%x 重新设置本地日期(08/20/99)
%X 重新设置本地时间(12:00:00)
%y 两位数字表示的年(99)
%Y 完整数字表示的年
%Z 时区(PDT)
%p 12小时表示法(AM/PM)
%% 百分号(%)

自定义函数

类似于c语言函数,但参数类型,以及返回值类型。

函数定义以function 开头,可定义在非语句块内的任意位置。

函数调用是可提供0个或多个参数,对于缺少的参数默认值为0或空字符串

通过return关键字可以提前结束函数并返回

函数的参数如果是标量则是传值,数组则是传引用,函数中改变数组的值可以改变全局数组中的值

$0,$1,$2...默认是全部脚本使用,无论在函数内还是函数外,可以认为是全局的

awk '
BEGIN{print max(1,2,3)}
function max(a,b,c)
{
	a=a>b?a:b;
	return a>c?a:c;
}'
3

awk '
BEGIN{print max(1,2,3)}
function max(a,b,c)
{
	a=a>b?a:b;
	return a;
	a>c?a:c;
}'
2

awk '
BEGIN{print max(1,2,3)}
function max(a,b,c)
{
	a=a>b?a:b;
	a>c?a:c;
}'
输出空格

执行方式

命令行方式

awk[option]‘commands‘输入文件

shell脚本方式

将所有的awk命令写在一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行。

相当于shell脚本首行的:#!/bin/sh,可以换成:#!/bin/awk -f

awk -f

将所有的awk命令插入一个单独文件,然后调用:

awk -f awk脚本 输入文件

-f选项加载awk脚本。

include和load

在一个awk脚本内部可以引用另外的awk脚本或库函数

通过关键字include和load来引用
 @include "filename"
 @load "filename"

也可通过-i指定include-file,和通过-l指定load-lib

文件的默认搜索路径由环境变量ENVIRON中的AWKPATH和AWKLIBPATH指定。

awk 'BEGIN{print sprintf("AWKPATH =" ENVIRON["AWKPATH"])}'
AWKPATH =.:/usr/share/awk
awk 'BEGIN{print sprintf("AWKLIBPATH =" ENVIRON["AWKLIBPATH"])}'
AWKLIBPATH =/usr/lib/gawk
在awksrc文件内
cat awksrc
function max(a,b,c)
{
	a=a>b?a:b;
	return a>c?a:c;
}

function min(a,b,c)
{
	a=a<b?a:b;
	return a<c?a:c;
}

cat testawk.awk
#!/bin/awk -f
@include "awksrc"
BEGIN{print "输入3个数字,将输出最大值:"}
{
	print max($1,$2,$3)
};
执行:
./testawk.awk
输入3个数字,将输出最大值:
1 2 3
3
时间: 2024-11-23 06:57:47

awk命令之进阶篇的相关文章

awk命令之基础篇

基本命令 awk'{action}' 输入文件 无条件执行action awk '/pattern/{action}' 输入文件 pattern匹配时执行action awk '(condition){action}' 输入文件 condition成立时执行action awk '/李四/{print $0}' tmp//输出含有'李四'关键字的一行记录 2 李四 70 awk '/^2/{print $0}' tmp//输出以2开头的一行记录 2 李四 70 关于字段: awk命令会读入的每一

C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码

前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面3篇就是基础内容..后面就开始逐渐要加深了,进阶篇开始了. 今天的学习内容? 今天我们讲讲Xamarin中的MVVM双向绑定,嗯..需要有一定的MVVM基础.,具体什么是MVVM - -,请百度,我就不多讲了 效果如下: 正文 1.简单的入门Demo 这个时间的功能很简单,就是一个时间的动态显示.

文本三剑客之awk进阶篇

此篇主要讲解awk控制语句,捎带说明getline和NR_FNR命令的使用.其中会用到awk基础知识,若有疑惑,可点击文本三剑客之awk基础篇进行翻阅. 示例文件 以下为通篇会用到的几个示例文件: [[email protected] awk_file]# cat file.txt name yu shu wai rick 80 86 90 long 68 89 78 jack 66 60 82 [[email protected] awk_file]# cat file.txt1 name y

Shell脚本三剑客——Grep(进阶版egrep)、Sed、Awk命令

Grep命令 1.基本正则表达式实例--查找特定字符 这里我们就以存放本机所有用户的/etc/passwd文件做实例 Demo1 [[email protected] ~]# grep -n "root" /etc/passwd //-n表示显示行号 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin 2.基本正则表达式实例--查找集合字符 有重复的字符时,可使用"

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

在Horizon Workspace中配置Windows单点登录-进阶篇

在上一篇基础篇里面,简单介绍了在Horizon Workspace 1.8中如何配置Windows单点登录.在这篇博客中,会继续介绍一些针对大规模虚机或者虚拟桌面部署的配置方式.这些配置方式可以保证用模板部署出来的虚机或虚拟桌面在Workspace服务器端配置完成的情况下,不再需要用户进行手动配置就能实现HorizonWorkspace的单点登录. 1. 在模板机组策略中配置IE浏览器的设置 通过在模板虚拟机上的管理控制台中设置相应的策略,可以使后续使用模板机克隆出来的虚拟机自动使用Window

java web进阶篇(四) Tomcat数据源

动态web开发的最大特点是可以进行数据库的操作,传统的jdbc操作由于步骤重复性造成程序性能下降. 先来回顾JDBC的操作原理 1.加载数据库驱动程序,数据库驱动程序通过classpath配置. 2.通过DirverManager类取得数据库连接对象. 3.通过Connection实例化PreparedStatement对象,编写sql语句命令操作数据库. 4.数据库属于资源操作,操作完成后要关闭数据库以释放资源. 其实以上操作,1.2.4步骤是重复的,保留3,实际上就是数据源产生的原因. 数据

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

SQL Server调优系列进阶篇(深入剖析统计信息)

前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQL Server2008R2,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks 相信了解SQL Server的朋友,对这两个库都不会太陌生. 概念理解 关于SQL Server中的统计信息,在联机丛书中是这样解释的 查询优化的统计信