当前位置:首页 > 代码 > 正文

awk源代码(awk命令)

admin 发布:2022-12-19 12:57 118


今天给各位分享awk源代码的知识,其中也会对awk命令进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

awk命令详解是什么?

awk命令是linux下的一个文件管理命令,具体语法格式为awk [参数] [文件],通常是用于文本和数据进行处理的编程语言,awk命令主要有两个功能;awk命令可以在linux/unix下对文本和数据进行处理;awk命令支持用户自定义函数和动态正则表达式。

相关介绍:

AWK是一种优良的文本处理工具。它不仅是Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人AlfredAho、PeterWeinberger和BrianKernighan姓氏的首个字母)的最大功能取决于一个人所拥有的知识。

AWK提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。

实际上AWK的确拥有自己的语言:AWK程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

最简单地说,AWK是一种用于处理文本的编程语言工具。AWK在很多方面类似于shell编程语言,尽管AWK具有完全属于其本身的语法。它的设计思想来源于SNOBOL4、sed、MarcRochkind设计的有效性语言、语言工具yacc和lex,当然还从C语言中获取了一些优秀的思想。

在最初创造AWK时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。

linux awk命令

一、awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

二. awk命令格式和选项

2.1 awk的语法有两种形式

1. 命令行方式

  awk [-F field-separator] 'commands' input-file(s)

  其中,commands是真正awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。

  在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

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

  awk -f awk-script-file input-file(s)

  其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。

2.2 命令选项

(1)-F fs or --field-separator fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

(2)-v var=value or --asign var=value :赋值一个用户定义变量。

(3)-f scripfile or --file scriptfile :从脚本文件中读取awk命令。

(4)-mf nnn and -mr nnn :对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

(5)-W compact or --compat, -W traditional or --traditional :在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

(6)-W copyleft or --copyleft, -W copyright or --copyright :打印简短的版权信息。

(7)-W help or --help, -W usage or --usage :打印全部awk选项和每个选项的简短说明。

(8)-W lint or --lint :打印不能向传统unix平台移植的结构的警告。

(9)-W lint-old or --lint-old :打印关于不能向传统unix平台移植的结构的警告。

(10)-W posix :打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

(11)-W re-interval or --re-inerval :允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

(12)-W source program-text or --source program-text :使用program-text作为源代码,可与-f命令混用。

(13)-W version or --version :打印bug报告信息的版本。

三. 使用方法

#awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

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

四. 模式和操作

awk脚本是由模式和操作组成的:

    pattern {action} 如$ awk '/root/' test,或$ awk '$3 100' test。

 两者是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。默认情况下,每一个输入行都是一条记录,但用户可通过RS变量指定不同的分隔符进行分隔。

4.1. 模式

模式可以是以下任意一个:

(1)正则表达式:使用通配符的扩展集。

(2)关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符(3)串或数字的比较,如$2%1选择第二个字段比第一个字段长的行。

(4)模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

(5)模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。

(6)BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

(7)END:让用户在最后一条输入记录被读取之后发生的动作。

4.2. 操作

 操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:

(1)变量或数组赋值

(2)输出命令

(3)内置函数

(4)控制流命令

五. awk的环境变量

六. awk运算符

七. 记录和域

7.1. 记录

   awk把每一个以换行符结束的行称为一个记录。

   记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。

   $0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。

   变量NR:一个计数器,每处理完一条记录,NR的值就增加1。

   如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。

7.2. 域

记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk '{print $1,$3}' test将打印test文件中第一和第三个以空格分开的列(域)。

7.3. 域分隔符

   内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。

   可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:/t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。

   输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5间的逗号就是OFS的值。

八. 匹配操作符(~)

   用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。

九. 比较表达式

   conditional expression1 ? expression2: expression3,

   例如:

   $ awk '{max = {$1 $3} ? $1: $3: print max}' test。如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。

   $ awk '$1 + $2 100' test。如果第一和第二个域相加大于100,则打印这些行。

   $ awk '$1 5 $2 10' test,如果第一个域大于5,并且第二个域小于10,则打印这些行。

十. 范围模板

范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ awk '/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。

请问linux下的系统命令是不是开源的? 比如sort,awk等等,如果是的话,在哪可以找到源代码?

Linux是开源的,它自带的功能强大的命令也是开源的,也就是说,我们可以获得这些命令的源代码并研究它。那究竟如何获得系统的命令的源代码呢?

命令的源代码是一个软件包为单元的,放在一个软件包的源代码中,若要下载一个命令的源代码,就要把这个命令所属的软件包的源代码都下载下来。命令的源代码就在下载的源代码的相关目录内,通常是src目录,相应的主文件名为cmd.c,其中cmd为具体的命令,如ls命令的主程序文件为ls.c。可查阅“Linux命令大全”了解Linux命令。

1、linux:使用awk命令列出姓名以M开头的员工姓名(ename)、hiredate、job三列?求源代码。急急急

awk '$1 ~/^M/' 日志文件名

使用通配符,让员工名和 ^M(表示M是第一个字母)配,配对成功的就打印。

你的日志什么格式的啊,name、hiredate、job三列分别在哪个字段啊,不给出来怎么写?

awk命令的几个选项注释

语法

awk [选项参数] 'script' var=value file(s)或awk [选项参数] -f scriptfile var=value file(s)

选项参数说明:

-F fs or --field-separator fs

指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

-v var=value or --asign var=value

赋值一个用户定义变量。

-f scripfile or --file scriptfile

从脚本文件中读取awk命令。

-mf nnn and -mr nnn

对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional

在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright

打印简短的版权信息。

-W help or --help, -W usage or --usage

打印全部awk选项和每个选项的简短说明。

-W lint or --lint

打印不能向传统unix平台移植的结构的警告。

-W lint-old or --lint-old

打印关于不能向传统unix平台移植的结构的警告。

-W posix

打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。

-W re-interval or --re-inerval

允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。

-W source program-text or --source program-text

使用program-text作为源代码,可与-f命令混用。

-W version or --version

打印bug报告信息的版本。

网上有很多资料,应该自己搜一下就能找到

Redhat Linux:使用awk、shell命令处理下表的问题,求源代码。急急急!非常感谢!

my %info;

my ( $id, $ename, $job, $mgr, $hiredate );

while (DATA) {

( $id, $ename, $job, $mgr, $hiredate ) = split /\s+/;

$info{$id} = {

ename = $ename,

job = $job,

mgr = $mgr,

hiredate = $hiredate

}

unless exists $info{$id};

}

my $format = "%-15s %-10s %-15s\n";

printf $format, qw(Ename Job Hiredate);

foreach my $empo_id ( keys %info ) {

if ( $info{$empo_id}-{'hiredate'} =~ /^M/ ) {

printf $format,

$info{$empo_id}-{'ename'},

$info{$empo_id}-{'job'},

$info{$empo_id}-{'hiredate'};

}

}

awk源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于awk命令、awk源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/8446.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载