`
斌强-朱
  • 浏览: 51484 次
社区版块
存档分类
最新评论

Linux awk

 
阅读更多

Linuxawk命令详解

AWK介绍
0.awk3个不同版本:awknawkgawk,未作特别说明,一般指gawk
1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。
2.三种方式调用awk
1)awk [opion] 'awk_script' input_file1 [input_file2...]
awk的常用选项option有;
①-F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,awk使用环境变量IFS的值
②-f filename : 从文件filename中读取awk_script
③-v var=value : awk_script设置变量
2)awk_script放入脚本文件并以#!/bin/awk -f作为首行,给予该脚本可执行权限,然后在shell下通过键入该脚本的脚本名调用之。
3)将所有的awk_script插入一个单独脚本文件,然后调用:awk -f awk脚本文件input_file(s)

3.awk的运行过程
1)awk_script的组成:
①awk_script可以由一条或多条awk_cmd组成,两条awk_cmd之间一般以NEWLINE分隔
②awk_cmd由两部分组成:awk_pattern { actions }
③awk_script可以被分成多行书写,必须确保整个awk_script被单引号括起来。
2)awk命令的一般形式:
awk' BEGIN { actions }
awk_pattern1 { actions}
............
awk_patternN { actions }
END { actions }
'inputfile
其中 BEGIN{ actions }END{ actions }是可选的。
3)awk的运行过程:
如果BEGIN区块存在,awk执行它指定的actions
②awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)
③awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量IFS或由参数指定。
把当前输入记录依次与每一个awk_cmdawk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd
当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。
awk读完所有的输入行后,如果存在END,就执行相应的actions

4)iput_file可以是多于一个文件的文件列表,awk将按顺序处理列表中的每个文件。
5)一条awk_cmdawk_pattern可以省略,省略时不对输入记录进行匹配比较就执行相应的actions。一条awk_cmdactions也可以省略,省略时默认的动作为打印当前输入记录(print$0)。一条awk_cmd中的awk_patternactions不能同时省略。
6)BEGIN区块和END区块别位于awk_script的开头和结尾。awk_script中只有END区块或者只有BEGIN区块是被允许的。如果awk_script中只有BEGIN{ actions } awk不会读取input_file
7)awk把输入文件的数据读入内存,然后操作内存中的输入数据副本,awk不会修改输入文件的内容。
8)awk的总是输出到标准输出,如果想让awk输出到文件,可以使用重定向。

4.awk_pattern
awk_pattern模式部分决定actions动作部分何时触发及触发actionsawk_pattern可以是以下几种类型:
1)正则表达式用作awk_pattern:/regexp/
① awk中正则表达式匹配操作中经常用到的字符:
\^ $ . [] | () * // 通用的regexp元字符
+: 匹配其前的单个字符一次以上,是awk自有的元字符,不适用于grepsed
?: 匹配其前的单个字符1次或0次,是awk自有的元字符,不适用于grepsed
举例:
awk'/ *\$0\.[0-9][0-9].*/' input_file
2)布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。
表达式中可以使用变量(如字段变量$1,$2)/regexp/
布尔表达式中的操作符:
关系操作符:< > <= >= == !=
匹配操作符:value ~ /regexp/如果value匹配/regexp/,则返回真
value!~ /regexp/ 如果value不匹配/regexp/,则返回真
举例:awk '$2 > 10 {print "ok"}' input_file
awk '$3 ~ /^d/{print "ok"}' input_file
③ &&()||()可以连接两个/regexp/或者布尔表达式,构成混合表达式。!()可以用于布尔表达式或者/regexp/之前。
举例:awk '($1 < 10 ) && ($2 > 10) {print "ok"}'input_file
awk '/^d/ || /x$/ {print "ok"}' input_file
其它表达式用作awk_script,如赋值表达式等
eg:awk '(tot+=$6); END{print "total points :" tot }'input_file // 分号不能省略
awk'tot+=$6 {print $0} END{print "total points :" tot }'input_file // 与上面等效

awk用法例举:
变量名含义
ARGC 命令行变元个数
ARGV命令行变元数组
FILENAME当前输入文件名
FNR当前文件中的记录号
FS输入域分隔符,默认为一个空格
RS输入记录分隔符
NF当前记录里域个数
NR到目前为止记录数
OFS输出域分隔符
ORS输出记录分隔符

1awk'/101/' file显示文件file中包含101的匹配行。
awk'/101/,/105/' file
awk '$1 == 5' file
awk '$1 == "CT"'file 注意必须带双引号
awk'$1 * $2 >100 ' file
awk '$2 >5 && $2<=15'file
2awk'{print NR,NF,$1,$NF,}' file显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk'/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第二个域加10
awk'/101/ {print $1$2}' file
awk '/101/ {print $1 $2}' file显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
3df| awk '$4>1000000 '通过管道符获得输入,如:显示第4个域满足条件的行。
4awk-F "|" '{print $1}' file按照新的分隔符“|”进行操作。
awk'BEGIN { FS="[: \t|]" }
{print $1,$2,$3}' file通过设置输入分隔符(FS="[:\t|]")修改输入分隔符。

Sep="|"
awk-F $Sep '{print $1}' file 按照环境变量Sep的值做为分隔符。
awk-F '[ :\t|]' '{print $1}' file按照正则表达式的值做为分隔符,这里代表空格、:TAB|同时做为分隔符。
awk-F '[][]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表[]
5awk-f awkfile file通过文件awkfile的内容依次进行控制。
catawkfile
/101/{print "\047 Hello! \047"} --遇到匹配行以后打印' Hello! '.\047代表单引号。
{print$1,$2} --因为没有模式控制,打印每一行的前两个域。
6awk'$1 ~ /101/ {print $1}' file显示文件中第一个域匹配101的行(记录)。
7awk'BEGIN { OFS="%"}
{print $1,$2}' file通过设置输出分隔符(OFS="%")修改输出格式。
8awk'BEGIN { max=100 ;print "max=" max} BEGIN表示在处理任意行之前进行的操作。
{max=($1>max ?$1:max); print $1,"Now max is "max}' file取得文件第一个域的最大值。
(表达式1?表达式2:表达式3相当于:
if(表达式1)
表达式2
else
表达式3
awk'{print ($1>4 ? "high "$1: "low "$1)}'file
9awk'$1 * $2 >100 {print $1}' file显示文件中第一个域匹配101的行(记录)。
10awk'{$1 == 'Chi' {$3 = 'China'; print}' file找到匹配行后先将第3个域替换后再显示该行(记录)。
awk'{$7 %= 3; print $7}' file 将第7域被3除,并将余数赋给第7域再打印。
11awk'/tom/ {wage=$2+$3; printf wage}' file找到匹配行后为变量wage赋值并打印该变量。
12awk'/tom/ {count++;}
END {print "tom was found "count"times"}' file END表示在所有输入行处理完后进行处理。
13awk'gsub(/\$/,"");gsub(/,/,""); cost+=$4;
END{print "The total is $" cost>"filename"}' filegsub函数用空串替换$,再将结果输出到filename中。
12 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00

awk'{gsub(/\$/,"");gsub(/,/,"");
if($4>1000&&$4<2000) c1+=$4;
else if($4>2000&&$4<3000) c2+=$4;
else if($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END{printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"'file
通过ifelseif完成条件语句

awk'{gsub(/\$/,"");gsub(/,/,"");
if($4>3000&&$4<4000) exit;
else c4+=$4; }
END{printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"'file
通过exit在某条件时退出,但是仍执行END操作。
awk'{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000)next;
else c4+=$4; }
END {printf "c4=[%d]\n",c4}"'file
通过next在某条件时跳过该行,对下一行执行操作。


14awk'{ print FILENAME,$0 }' file1 file2 file3>fileallfile1file2file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。
15awk' $1!=previous { close(previous); previous=$1 }
{printsubstr($0,index($0," ") +1)>$1}' fileall把合并后的文件重新分拆为3个文件。并与原文件一致。
16awk'BEGIN {"date"|getline d; print d}'通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
17awk'BEGIN {system("echo "Input your name:\\c"");getline d;print "\nYour nameis",d,"\b!\n"}'
通过getline命令交互输入name,并显示出来。
awk'BEGIN {FS=":"; while(getline< "/etc/passwd">0) { if($1~"050[0-9]_") print$1}}'
打印/etc/passwd文件中用户名包含050x_的用户名。

18awk'{ i=1;while(i<NF) {print NF,$i;i++}}' file通过while语句实现循环。
awk'{ for(i=1;i<NF;i++) {print NF,$i}}' file 通过for语句实现循环。
typefile|awk -F "/" '
{ for(i=1;i<NF;i++)
{if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i} }}' 显示一个文件的全路径。
forif显示日期
awk'BEGIN {
for(j=1;j<=12;j++)
{ flag=0;
printf"\n%d月份\n",j;
for(i=1;i<=31;i++)
{
if(j==2&&i>28) flag=1;
if((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0){printf "%02d%02d",j,i}
}
}
}'
19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk'{print '$Flag'}' 结果为abcd
awk'{print "$Flag"}' 结果为$Flag

分享到:
评论

相关推荐

    Linuxawk命令详解[归类].pdf

    Linux awk 命令详解 Linux awk 命令是 Unix 环境中的一种功能强大的文本处理工具,由 Bell Labs 的 Alfred Aho、Peter Weinberger 和 Brian Kernighan 于 1977 年开发。awk 命令的主要功能是从文件或字符串中基于...

    最牛逼的Linux awk命令详细介绍和实例快速学习

    最牛逼的Linux awk命令详细介绍和实例快速学习

    linux awk学习

    ### Linux Awk 学习知识点详解 #### 一、Awk 简介与基本用法 Awk 是一种在 Unix 和类 Unix 操作系统上广泛使用的文本处理工具,能够帮助用户快速处理文本数据,执行复杂的文本分析任务。Awk 的主要功能包括模式...

    linux awk详解awk详解awk详解awk详解

    Linux awk 详解 awk 是一种功能强大的程序语言,主要用于处理文档资料。它的名称来自三个最初设计者的姓氏的第一个字母:Alfred V. Aho、Peter J. We i n b e rg e r 和 Brian W.Kernighan。awk 最初在 1977 年完成...

    Linux AWK内置函数

    ### Linux AWK内置函数详解 #### 一、算术函数 AWK 提供了一系列内置的数学函数,可以方便地处理各种数学运算。 1. **`atan2(y, x)`** - **功能**:计算 y 和 x 的商的反正切值。 - **示例**:`awk 'BEGIN { ...

    linux awk 操作日指南

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

    Linux awk 命令用法详解

    Linux awk 命令 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 语法 awk [选项参数]...

    linux awk用法指南

    Linux AWK 用法指南 AWK 是一种强大的数据处理和文本处理工具,经常用于 Linux 和 Unix 系统中。AWK 的全称是 Aho, Weinberger 和 Kernighan,这三个名字来自三位开发者。AWK 的主要功能是从文件或字符串中基于指定...

    Linux AWK使用描述

    Linux AWK 使用描述 AWK 是一种强大的行处理器,在 Linux 中广泛应用于文本处理。AWK 的主要优点是可以处理庞大文件而不出现内存溢出或处理缓慢的问题。 AWK处理过程: AWK 命令的基本形式为:awk [-F|-f|-v] ...

    linux_awk 学习手册

    【Linux Awk 学习手册】 awk 是一个强大的文本分析工具,源于 UNIX 系统,由 Aho、Weinberg 和 Kernighan 三位开发者命名。它的全名并不表示特定的功能,而是创建者姓名的首字母缩写。awk 的主要功能在于对文本数据...

    linuxawk完全手册.pdf

    【Linux Awk 完全手册】深入解析 Awk 是一种强大的文本分析工具,由 Aho、Weinberg 和 Kernighan 三位开发者命名,它不仅具备样式扫描和处理的能力,还能执行复杂的文本处理任务,甚至包含内置的变量和函数,形成了...

    linux-awklinux-awk

    ### Linux Awk 学习指南 #### 1. Awk 简介 Awk 是一种专门设计用于处理文本和数据的编程语言,主要用于 Linux/Unix 操作系统中。它可以处理来自标准输入、一个或多个文件,甚至是其他命令的输出结果。Awk 支持高级...

    linux awk 命令大全

    Linux中的`awk`命令是一个强大的文本分析工具,它允许用户基于特定的模式匹配对文本文件进行处理。在本文中,我们将深入探讨`awk`的基本概念、语法和常见用途。 首先,`awk`有三个主要版本:`awk`、`nawk`和`gawk`...

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

    ### Linux Awk 多文件操作两种实现方法详解 #### 一、引言 在Linux环境中,经常需要对多个文件进行处理,特别是在数据处理和文本分析领域。Awk作为一种强大的文本处理工具,在处理这类任务时非常高效。本文将详细...

    Linux AWK 命令

    Linux中的AWK命令是一个强大的文本分析工具,它允许用户在数据流中进行模式匹配和处理。这个命令的名字来源于它的三位创始人—— Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 的首字母缩写。在Linux...

    awk实用程序源码.zip_awk源码_linux_linux awk 源码_makefile_实用程序

    在Linux系统中,`awk`被广泛用于数据提取、格式转换和报告生成等任务。这个压缩包`awk实用程序源码.zip`包含了`awk`的源码,这对于深入理解其工作原理和学习如何编写自己的`awk`程序非常有帮助。 首先,让我们来看...

    linux AWK 教程

    ### Linux AWK 教程详解 #### 1. AWK 简介 AWK 是一种专门设计用于处理文本和数据的编程语言,它在 Linux 和 Unix 环境下非常流行。AWK 可以从标准输入、一个或多个文件、甚至是其他命令的输出中读取数据。它的...

    linux awk学习笔记

    Linux中的`awk`是一个强大的文本分析工具,由Alfred Aho、Brian Kernighan和Peter Weinberger三位开发者创建,因此得名。`awk`的主要功能是处理文本和数据,通过匹配特定模式对文件中的行进行操作。在Linux系统中,...

Global site tag (gtag.js) - Google Analytics