`
nanjingjiangbiao_T
  • 浏览: 2689065 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

linux awk 内置函数实例

 
阅读更多

awk内置函数,主要分4种:算数函数、字符串函数、时间函数、一般函数


一、算术函数

以下算术函数执行与 C 语言中名称相同的子例程相同的操作:

函数名 说明
atan2( y, x ) 返回 y/x 的反正切。
cos( x ) 返回 x 的余弦;x 是弧度。
sin( x ) 返回 x 的正弦;x 是弧度。
exp( x ) 返回 x 幂函数。
log( x ) 返回 x 的自然对数。
sqrt( x ) 返回 x 平方根。
int( x ) 返回 x 的截断至整数的值。
rand( ) 返回任意数字 n,其中 0 <= n < 1。
srand( [Expr] ) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。

示例:

awk 'BEGIN{OFMT="%.3f"; fs=sin(3.14/2); fe=exp(1); fl=log(exp(2)); fi=int(3.1415); fq=sqrt(100); print fs, fe, fl, fi, fq;}'

结果:

1.000 2.718 2 3 10 # sin(3.14/2) = 1.000; exp(1) = 2.718; log(exp(2)) = 2; int(3.1415) = 3; sqrt(100) = 10


随机数:

awk 'BEGIN{srand(); fr=int(100*rand()); print fr;}'

结果:

64

9

25



二、字符串函数

函数 说明
gsub( Ere, Repl, [ In ] ) 除了正则表达式所有具体值被替代这点,它和 sub 函数完全一样地执行,。
sub( Ere, Repl, [ In ] ) 用 Repl 参数指定的字符串替换 In 参数指定的字符串中的由 Ere 参数指定的扩展正则表达式的第一个具体值。sub 函数返回替换的数量。出现在 Repl 参数指定的字符串中的 &(和符号)由 In 参数指定的与 Ere 参数的指定的扩展正则表达式匹配的字符串替换。如果未指定 In 参数,缺省值是整个记录($0 记录变量)。
index( String1, String2 ) 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。如果 String2 参数不在 String1 参数中出现,则返回 0(零)。
length [(String)] 返回 String 参数指定的字符串的长度(字符形式)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。
blength [(String)] 返回 String 参数指定的字符串的长度(以字节为单位)。如果未给出 String 参数,则返回整个记录的长度($0 记录变量)。
substr( String, M, [ N ] ) 返回具有 N 参数指定的字符数量子串。子串从 String 参数指定的字符串取得,其字符以 M 参数指定的位置开始。M 参数指定为将 String 参数中的第一个字符作为编号 1。如果未指定 N 参数,则子串的长度将是 M 参数指定的位置到 String 参数的末尾 的长度。
match( String, Ere ) 在 String 参数指定的字符串(Ere 参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果 Ere 参数不出现,则返回 0(零)。RSTART 特殊变量设置为返回值。RLENGTH 特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。
split( String, A, [Ere] ) 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。此分隔可以通过 Ere 参数指定的扩展正则表达式进行,或用当前字段分隔符(FS 特殊变量)来进行(如果没有给出 Ere 参数)。除非上下文指明特定的元素还应具有一个数字值,否则 A 数组中的元素用字符串值来创建。
tolower( String ) 返回 String 参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
toupper( String ) 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的 LC_CTYPE 范畴定义。
sprintf(Format, Expr, Expr, . . . ) 根据 Format 参数指定的printf子例程格式字符串来格式化 Expr 参数指定的表达式并返回最后生成的字符串。

1) sub, gsub使用

awk 'BEGIN{info="this is a test in 2013-01-04"; sub(/[0-9]+/, "!", info); print info}' # sub

结果:

this is a test in !-01-04


awk 'BEGIN{info="this is a test in 2013-01-04"; gsub(/[0-9]+/, "!", info); print info}' # gsub

结果:

this is a test in !-!-!


2) index 查找

awk 'BEGIN{info="this is a test in 2013-01-04"; print index(info, "test") ? "found" : "no found";}' # 匹配 “test” ,打印 “found; 不匹配, 打印 ”not found“

结果:

found


3) match 匹配

awk 'BEGIN{info="this is a test in 2013-01-04"; print match(info, /[0-9]+/) ? "found" : "no found";}' # 匹配 数字 ,打印 “found; 不匹配, 打印 ”not found“

结果:

found


4) substr 子串

awk 'BEGIN{info="this is a test in 2013-01-04"; print substr(info, 4, 10);}' # 第4-10字符,起始从1计

结果:

s is a tes


5) split 分割

awk 'BEGIN{info="this is a test in 2013-01-04"; split(info, tA, " "); print "len : " length(tA); for(k in tA) {print k, tA[k];}}' # 以空格“ ” 分割,打印数组长度,及其各元素

结果:

len : 6
4 test
5 in
6 2013-01-04
1 this
2 is
3 a


6) sprintf 格式化输出

格式化字符串格式:

格式符 说明
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法

其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。

awk 'BEGIN{n1=124.113; n2=-1.224; n3=1.2345; printf("n1 = %.2f, n2 = %.2u, n3 = %.2g, n1 = %X, n1 = %o\n", n1, n2, n3, n1, n1);}'

结果:

n1 = 124.11, n2 = 18446744073709551615, n3 = 1.2, n1 = 7C, n1 = 174



三、时间函数


函数名 说明
mktime( YYYY MM DD HH MM SS[ DST]) 生成时间格式
strftime([format [, timestamp]]) 格式化时间输出,将时间戳转为时间字符串
具体格式,见下表.
systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数

strftime日期和时间格式说明符

格式 描述
%a 星期几的缩写(Sun)
%A 星期几的完整写法(Sunday)
%b 月名的缩写(Oct)
%B 月名的完整写法(October)
%c 本地日期和时间
%d 十进制日期
%D 日期 08/20/99
%e 日期,如果只有一位会补上一个空格
%H 用十进制表示24小时格式的小时
%I 用十进制表示12小时格式的小时
%j 从1月1日起一年中的第几天
%m 十进制表示的月份
%M 十进制表示的分钟
%p 12小时表示法(AM/PM)
%S 十进制表示的秒
%U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始)
%w 十进制表示的星期几(星期天是0)
%W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)
%x 重新设置本地日期(08/20/99)
%X 重新设置本地时间(12:00:00)
%y 两位数字表示的年(99)
%Y 当前月份
%Z 时区(PDT)
%% 百分号(%)

示例

awk 'BEGIN{tstamp=mktime("2013 01 04 12 12 12"); print strftime("%c", tstamp);}'

结果:

Fri 04 Jan 2013 12:12:12 PM CST


awk 'BEGIN{tstamp1=mktime("2013 01 04 12 12 12"); tstamp2=mktime("2013 02 01 0 0 0"); print tstamp2-tstamp1;}'

结果:

2375268


awk 'BEGIN{tstamp1=mktime("2013 01 04 12 12 12"); tstamp2=systime(); print tstamp2-tstamp1;}'

结果:

33771



四、 一般函数

函数 说明
close( Expression ) 用同一个带字符串值的 Expression 参数来关闭由 print 或 printf 语句打开的或调用 getline 函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则 close 语句是必需的。
system(Command ) 执行 Command 参数指定的命令,并返回退出状态。等同于system子例程。
Expression | getline [ Variable ] 从来自 Expression 参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给 Variable 参数指定的变量。如果当前未打开将 Expression 参数的值作为其命令名称的流,则创建流。创建的流等同于调用popen子例程,此时 Command 参数取 Expression 参数的值且 Mode 参数设置为一个是 r 的值。只要流保留打开且 Expression 参数求得同一个字符串,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ] < Expression 从 Expression 参数指定的文件读取输入的下一个记录,并将 Variable 参数指定的变量设置为该记录的值。只要流保留打开且 Expression 参数对同一个字符串求值,则对 getline 函数的每次后续调用读取另一个记录。如果未指定 Variable 参数,则 $0 记录变量和 NF 特殊变量设置为从流读取的记录。
getline [ Variable ] 将 Variable 参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定 Variable 参数,则 $0 记录变量设置为该记录的值,还将设置 NF、NR 和 FNR 特殊变量。

示例

1) close 用法

awk 'BEGIN{while("cat /etc/passwd" | getline) {print $0;}; close("/etc/passwd");}' | head -n10

结果:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh


2) getline 用法

awk 'BEGIN{while(getline < "/etc/passwd"){print $0;}; close("/etc/passwd");}' | head -n10

结果:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh


awk 'BEGIN{print "Enter your name:"; getline name; print name;}'

结果:

Enter your name:
root
root


3) System 用法

awk 'BEGIN{b=system("ls -al"); print b;}'

结果:

total 32
drwxr-xr-x 2 homer homer 4096 2013-01-04 20:27 .
drwxr-xr-x 4 homer homer 4096 2013-01-04 11:35 ..
-rw-r--r-- 1 homer homer 1773 2013-01-04 19:54 2013-01-03_output_top800_title_url.log
-rw-r--r-- 1 homer homer 1773 2013-01-04 19:55 2013-01-04_output_top800_title_url.log
-rwxr-xr-x 1 homer homer 555 2013-01-04 20:23 catline.sh
-rw-r--r-- 1 homer homer 26 2013-01-04 20:27 ret.txt
-rw-r--r-- 1 homer homer 16 2013-01-04 19:58 str2.txt
-rw-r--r-- 1 homer homer 16 2013-01-04 11:15 str.txt
0



参考推荐:

awk 实例(IBM)

沉于思考,默默学习


分享到:
评论

相关推荐

    linux awk 内置变量使用介绍.docx

    结合实例,我们可以看到这些内置变量的实际应用: - 示例1演示了如何使用选择表达式`/^root/`打印/etc/passwd文件中以`root`开头的行。 - 示例2展示了如何通过设置`FS`为冒号,来以冒号分割字段,并打印以`root`开头...

    linux-awklinux-awk

    Awk 提供了许多内置函数,如 `length()`, `split()`, `index()`, `tolower()`, `toupper()` 等。 #### 15. How-to 这里提供了 Awk 的一些常见用途和示例,涵盖了 Awk 的基本使用方法和技巧,适合初学者快速上手。 ...

    linux awk 操作日指南

    ### Linux Awk 操作日指南知识点详解 #### Awk简介及背景 - **定义与特点**:Awk 是一种专为文本处理而设计的编程语言,具有强大的模式扫描与处理能力。它支持复杂的条件判断、循环等结构化的编程概念,并且能够...

    AWK编程实例指南.rar_AWK ns2_awk_awk unix.shell_awk编程实例

    这可能包括如何定义模式、动作、字段分隔符,以及如何使用内置变量和函数。通过这个指南,学习者可以了解如何使用AWK进行数据过滤、统计计算、格式化输出等任务。 "www.pudn.com.txt"可能是一个实际的AWK脚本或者...

    shell awk实用实例教程

    5. **条件语句和函数**:Awk支持条件判断(`if...else`)和循环(`for`、`while`),还有许多内置函数,如`length()`计算字符串长度,`split()`分割字符串。 6. **数组**:Awk支持关联数组,可以在处理数据时存储和...

    AWK实例教程 AWK实例教程中文版

    此外,AWK还内置了许多用于字符串操作、数学计算等功能的函数,使得开发者可以快速编写出高效稳定的脚本。 - **语法**:AWK借鉴了C语言、Python和Bash等语言的语法特点,因此对于熟悉这些语言的开发者来说,学习AWK...

    linux bash之 awk用法

    同时,Awk的内置变量和函数使得数据处理变得更加直观和高效。 3. **高效性**:尽管Awk的功能强大,但它的执行效率也非常高。Awk程序通常比使用其他编程语言编写的等效程序运行得更快,尤其是在处理大量数据时。 ##...

    linux AWK 教程

    它的强大之处在于支持用户自定义函数和动态正则表达式等功能,这使得 AWK 成为了 Linux/Unix 下的一个强大的编程工具。 #### 2. AWK 命令格式和选项 ##### 2.1 AWK 的语法有两种形式 - **命令行模式**:`awk ...

    linuxsed与awk第三版

    本书会详细阐述awk的内置变量、函数,以及如何使用条件语句和循环控制程序流程。 在《Linux Sed与Awk第三版》中,作者可能会涵盖以下核心知识点: 1. Sed基础:介绍sed的基本命令,如`s`(替换)、`a`(追加)、`i...

    Linux入门培训教程 linux awk 多文件操作2种实现方法.pdf

    1. **直接读取多个文件**:通过awk内置的功能直接打开并处理多个文件,无需使用额外的命令来合并文件。 2. **利用awk内部变量**:利用`FILENAME`、`NR`、`FNR`等内部变量来区分当前处理的是哪个文件以及文件中的哪一...

    awk实例详解——Unix下awk的使用

    `awk`的动作可以包括打印(`print`)、重定向(`printf`)、条件判断(`if...else`)、循环(`for`、`while`)以及内置函数,如计算平均值(`awk '{sum+=$1} END{print sum/NR}'`)。 **6. 行内模式匹配** 除了匹配...

    linux下awk工具的使用

    - **内置函数**: 提供了一系列内置函数,如 `length()`、`split()` 等,用于执行常见任务。 #### 15. How-to - **如何使用 awk 处理大文件**: 对于处理大型数据文件,可以通过调整内存限制 (`-mf` 和 `-mr`) 来优化...

    AWK脚本学习文档 Linux

    此工具允许用户根据指定的模式对输入文本进行操作,提供了丰富的内置函数和灵活的数据操作能力。 **一、AWK的基本结构** 一个AWK脚本通常包含模式和动作两部分。模式定义了处理哪些行,而动作则定义了如何处理这些...

    UNIX Shell awk sed 实例 精解 (第4版)

    在处理选定的行时,awk可以执行算术或字符串操作,甚至可以调用内置函数或自定义函数。awk的强大之处在于其内置的规则和动作,能够方便地进行数据格式转换和报表生成。 **sed** 是流编辑器(Stream Editor),它在...

    awk教程-awk教程.rar

    - **函数**:awk提供了内置的数学和字符串处理函数,如length()、split()、substr()等。 - **自定义函数**:可以创建用户自定义函数来复用代码。 ### 5. 在Windows中使用AWK 虽然awk是Unix/Linux下的标准工具,但...

    LINUX中详解AWK内建变量FS,NF,NR,RT,RS,ORS,OFS

    它拥有丰富的内置变量和函数,使得用户能够方便地处理各种复杂的文本数据。本文将详细介绍AWK中的几个常用内建变量:FS、NF、NR、RT、RS、ORS、OFS,并通过实例展示它们的使用方法。 #### 二、变量介绍 1. **FS ...

    AWK 实例与编程技巧

    通过学习和掌握AWK,可以提升在文本数据分析和处理方面的效率,尤其是在UNIX/Linux环境中,AWK常常被用来处理日志文件、格式转换和其他文本操作任务。所以,尽管名字不那么动听,但AWK确实是一种值得学习和利用的...

    awk参考资料下载awk

    - **内置函数**: 包括算术函数(如`+`、`-`、`*`、`/`)、字符串函数(如`length`、`index`、`substr`)和控制流程函数(如`if`、`for`、`while`)等。 - **表达式**: 用于计算或判断,结果可以影响操作的执行。 ...

    awk入门到精通.pdf

    此外,awk擅长处理以记录和字段形式组织的数据,并且内置管道功能,可以方便地与其他Shell命令配合,处理数据并利用系统资源。 使用awk的一个重要场景是编写小工具,它们针对特定问题进行处理,通过Shell管道连接,...

Global site tag (gtag.js) - Google Analytics