awk基本使用

awk命令的格式:

awk [options] ‘awk-script‘ input-file ...

options:

-F: 指定Field separator域分隔符

-f: 指定awk-script文件名

awk-script: 指定awk命令

input-file: 指定awk输入文件

awk-script的结构:

由BEGIN,body,END三部分组成

BEGIN格式:

BEGIN { awk-commands }

用于打印表头

初始化变量

BEGIN关键字需要大写

BEGIN关键字可选

BODY格式:

/pattern/ { action }

对于input-file每一行执行一次

END格式:

END { awk-commands }

打印表尾

END关键字需要大写

END关键字可选

print命令:print等同于print $0,$0代表所有记录

# cat employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

# awk -F, ‘{print}‘ employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

# awk -F, ‘{print $0}‘ employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

print 命令:位置参数$1 $2 ... $n,分别代表一行记录的第1列,第2列...第n列

# awk -F, ‘{print $1,$2}‘ employee.txt 
101 Johnny Doe
102 Jason Smith
103 Raj Reddy
104 Anand Ram
105 Jane Miller

awk的内置变量:

FS: Input Field Separator 输入域分隔符

OFS: Output Field Separator 输出域分隔符

RS: Input Record Separator 输入记录分隔符

ORS: Output Record Separator 输出记录分隔符

NR: Number of Records 记录编号

FILENAME: Current File Name 输入文件名

FNR: File " Number of Record " 针对文件的记录编号

NF: Number of Field 字段数

FS:

# awk ‘BEGIN { FS=","; print "UserID\tTitle\n------------" } { print $1,$3 } END { print "------------" }‘ employee.txt  
UserID  Title
------------
101 CEO
102 IT Manager
103 Sysadmin
104 Developer
105 Sales Manager
------------

OFS:

# awk ‘BEGIN { FS=","; OFS=":";print "UserID\tTitle\n------------" } { print $1,$3 } END { print "------------" }‘ employee.txt    
UserID  Title
------------
101:CEO
102:IT Manager
103:Sysadmin
104:Developer
105:Sales Manager
------------

RS:

# cat employee-one-line.txt                                           
101,Johnny Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane Miller
# awk ‘BEGIN{RS=":"}{print $1}‘ employee-one-line.txt        
101,Johnny
102,Jason
103,Raj
104,Anand
105,Jane
# awk ‘BEGIN{FS=",";RS=":"}{print $1}‘ employee-one-line.txt          
101
102
103
104
105

ORS:

# cat employee-one-line.txt                                           
101,Johnny Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane Miller

# awk ‘BEGIN{FS=",";RS=":"}{print $1,$2}‘ employee-one-line.txt       101 Johnny Doe
102 Jason Smith
103 Raj Reddy
104 Anand Ram
105 Jane Miller

# awk ‘BEGIN{FS=",";RS=":";ORS="\n----\n"}{print $1,$2}‘ employee-one-line.txt 
101 Johnny Doe
----
102 Jason Smith
----
103 Raj Reddy
----
104 Anand Ram
----
105 Jane Miller

----

NR:

# awk ‘BEGIN {FS=",";print "-----------"}{print "Record",NR,"is",$1,$2,$3}‘ employee.txt        
-----------
Record 1 is 101 Johnny Doe CEO
Record 2 is 102 Jason Smith IT Manager
Record 3 is 103 Raj Reddy Sysadmin
Record 4 is 104 Anand Ram Developer
Record 5 is 105 Jane Miller Sales Manager

FILENAME :

# awk ‘BEGIN {FS=",";print "-----------"}{print FILENAME,"Record",NR,"is",$1,$2,$3}‘ employee.txt 
-----------
employee.txt Record 1 is 101 Johnny Doe CEO
employee.txt Record 2 is 102 Jason Smith IT Manager
employee.txt Record 3 is 103 Raj Reddy Sysadmin
employee.txt Record 4 is 104 Anand Ram Developer
employee.txt Record 5 is 105 Jane Miller Sales Manager

FNR:

# awk ‘BEGIN {FS=",";print "-----------"}{print FILENAME,"Record",NR,"is",$1,$2,$3}‘ employee.txt items.txt 
-----------
employee.txt Record 1 is 101 Johnny Doe CEO
employee.txt Record 2 is 102 Jason Smith IT Manager
employee.txt Record 3 is 103 Raj Reddy Sysadmin
employee.txt Record 4 is 104 Anand Ram Developer
employee.txt Record 5 is 105 Jane Miller Sales Manager
items.txt Record 6 is 101 HD Camcorder Video
items.txt Record 7 is 102 Refrigerator Applicance
items.txt Record 8 is 103 MP3 Player Audio
items.txt Record 9 is 104 Tennis Racket Sports
items.txt Record 10 is 105 Laser Printer Office
# awk ‘BEGIN {FS=",";print "-----------"}{print FILENAME,"Record",FNR,"is",$1,$2,$3}‘ employee.txt items.txt 
-----------
employee.txt Record 1 is 101 Johnny Doe CEO
employee.txt Record 2 is 102 Jason Smith IT Manager
employee.txt Record 3 is 103 Raj Reddy Sysadmin
employee.txt Record 4 is 104 Anand Ram Developer
employee.txt Record 5 is 105 Jane Miller Sales Manager
items.txt Record 1 is 101 HD Camcorder Video
items.txt Record 2 is 102 Refrigerator Applicance
items.txt Record 3 is 103 MP3 Player Audio
items.txt Record 4 is 104 Tennis Racket Sports
items.txt Record 5 is 105 Laser Printer Office

NF:输出结果中,第一列是文件名,第二列是记录编号,第三列是每个记录的字段数

# awk -F, ‘{print FILENAME,NR,NF}‘ employee.txt 
employee.txt 1 3
employee.txt 2 3
employee.txt 3 3
employee.txt 4 3
employee.txt 5 3

awk变量和操作符:

一元操作符:

+: 返回当前数字

-:取负数

++:自加

--:自减

+:

# cat employee-sal.txt 
101,Johnny Doe,CEO,10000
102,Jason Smith,IT Manager,5000
103,Raj Reddy,Sysadmin,4500
104,Anand Ram,Developer,4500
105,Jane Miller,Sales Manager,3000

# awk ‘BEGIN{FS=","}{print +$4}‘ employee-sal.txt 
10000
5000
4500
4500
3000

-:

# awk ‘BEGIN{FS=","}{print -$4}‘ employee-sal.txt  
-10000
-5000
-4500
-4500
-3000

++:pre自加,先自加,再打印变量

# awk ‘BEGIN{FS=","}{print ++$4}‘ employee-sal.txt  
10001
5001
4501
4501
3001

--:pre自减,先自减,再打印变量

# awk ‘BEGIN{FS=","}{print --$4}‘ employee-sal.txt   
9999
4999
4499
4499
2999

++:post自加,先执行打印变量,再自加

# awk ‘BEGIN{FS=","}{print $4++}‘ employee-sal.txt      
10000
5000
4500
4500
3000
# awk ‘BEGIN{FS=","}{$4++;print $4++}‘ employee-sal.txt 
10001
5001
4501
4501
3001

--:post自减,先执行打印变量,再自减

# awk ‘BEGIN{FS=","}{print $4--}‘ employee-sal.txt   
10000
5000
4500
4500
3000
# awk ‘BEGIN{FS=","}{$4--;print $4--}‘ employee-sal.txt 
9999
4999
4499
4499
2999

数学运算:

+: 加

-: 减

*: 乘

/:  除

%: 取模

# cat arit.awk 
BEGIN{
 FS=",";
 OFS=",";
 item_discount=0;
}
{
 item_discount=$4*20/100;
 print $1,$2,$3,$4-item_discount,$5-1
}
 
# cat items.txt 
101,HD Camcorder,Video,210,10
102,Refrigerator,Applicance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5

# awk -f arit.awk items.txt  
101,HD Camcorder,Video,168,9
102,Refrigerator,Applicance,680,1
103,MP3 Player,Audio,216,14
104,Tennis Racket,Sports,152,19
105,Laser Printer,Office,380,4

字符操作:

# cat string.awk 
BEGIN {
 FS=",";
 OFS=",";
 string1="Hello";
 string2="World";
 numberstring="100";
 string3=string1" "string2;
 print "Concatenate string is: " string3;
 numberstring+=1;
 print "String to number: " numberstring;
 }

# awk -f string.awk items.txt 
Concatenate string is: Hello World
String to number: 101

赋值运算:

=:赋值

+=: a+=1等同于a=a+1

-=: a-=1等同于a=a-1

*=: a*=2等同于a=a*2

/=: a/=2等同于a=a/2

%=: a%=2等同于a=a%2

# cat total.awk 
BEGIN {
 total1=total2=total3=total4=total5=10;
 total1+= 5; print total1;
 total2-= 5; print total2;
 total3*= 5; print total3;
 total4/= 5; print total4;
 total5%= 5; print total5;
}
 
# awk -f total.awk 
15
5
50
2

比较运算:

>:

>=:

<:

<=:

==:

!=:

&&:

||:

# cat items.txt 
101,HD Camcorder,Video,210,10
102,Refrigerator,Applicance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5

# awk -F, ‘$5 <=5‘ items.txt 
102,Refrigerator,Applicance,850,2
105,Laser Printer,Office,475,5
# awk -F, ‘$4 < 200‘ items.txt    
104,Tennis Racket,Sports,190,20
# awk -F, ‘$4 == 475 && $5 == 5‘ items.txt  
105,Laser Printer,Office,475,5
# awk -F, ‘$4 == 475 || $5 == 15‘ items.txt   
103,MP3 Player,Audio,270,15
105,Laser Printer,Office,475,5
# awk -F, ‘$3 != "Video"‘ items.txt  
102,Refrigerator,Applicance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5

正则表达式操作:

~:匹配

!~:不匹配

# awk -F, ‘$3 ~ "ce"‘ items.txt 
102,Refrigerator,Applicance,850,2
105,Laser Printer,Office,475,5

# awk -F, ‘$3 !~ "ce"‘ items.txt
101,HD Camcorder,Video,210,10
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
时间: 2024-11-06 09:39:14

awk基本使用的相关文章

新awk整理

总感觉上一篇awk的总结几乎是照着man翻译过来的,惨不忍睹 无意间在互联网上有找到了宝贵的资料 感觉整理的很好,想着照着这个来重新写下,对照新的man更新下吧,只是总是在改变的 一.awk简介二.awk工作流程三.awk程序结构四.awk基本语法 awk命令行模式 awk程序文件 awk标准选项五.awk内置变量 标准awk变量 awk特定变量(即专有变量)六.awk操作符 算数运算符 关系运算符 逻辑运算符 三元运算符 一元运算符 字符串连接操作符(即空格符) 数组成员操作符(in) 正则表

linux提取指定列字符并打印所有内容(awk)

假设有文件长如下样子: CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  samplename 1 3552841 . G . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0;MQ=40;FQ=-29.9912 GT:PL:DP 0/0:0:1 1 3552842 . T . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0

shell之awk

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行读入,以空格为默认分割符将每行切片,切开的部分再进行各种分析处理. 使用方法: awk [option] 'pattern1{action1}pattern2{action2}' {filenames} 尽管操作可能会很复杂,但语法总是这样,其中pattern表示awk在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令. awk

awk中使用shell变量

其实在awk里,是不能直接使用shell变量的 方法是:awk -v 选项让awk 里使用shell变量 TIME=60 awk -v time="$TIME" 'BEGIN{FS="|"} {if ($7>time) print $2 }' 这样要注意:在awk里,time不能加$符号. 网上说如下方法都可行: 一:"'$var'" 这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如: var="test&quo

awk 字符串处理函数

awk提供了许多强大的字符串函数,见下表:awk内置字符串函数gsub(r,s)    在整个$0中用s替代rgsub(r,s,t)    在整个t中用s替代rindex(s,t)    返回s中字符串t的第一位置length(s)    返回s长度match(s,r)    测试s是否包含匹配r的字符串split(s,a,fs)    在fs上将s分成序列asprint(fmt,exp)    返回经fmt格式化后的expsub(r,s)    用$0中最左边最长的子串代替ssubstr(s,

awk

cat 1.txt 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 行转列: awk '{for(i=1;i<=NF;i++)printf("%s\n",$i)};{printf "\n"}' 1.txt 显示如下: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

Linux文本处理三剑客之GNU awk的使用

awk: Aho, Weinberger, Kernighan,报告生成器,格式化文本输出 有多种版本:New awk(nawk),GNU awk(gawk) gawk –模式扫描和处理语言 基本用法: awk[options] 'program' var=value file- awk[options] -f programfile var=value file- awk[options] 'BEGIN{ action;... } pattern{ action;... } END{ acti

第4章 awk编程

1 awk编程模型       2 awk用法 调用awk有三种方法(与sed类似): 在Shell命令行输入命令调用awk,格式为: awk [-F 域分隔符] 'awk程序段' 输入文件 将awk程序段插入脚本文件后,然后通过awk命令调用它: awk -f awk脚本文件输入文件 将awk命令插入脚本文件后,最常用的方法是设置该脚本文件为可执行,然后直接执行该脚本文件,格式为: ./awk脚本文件输入文件 注:第二种方法脚本文件的首行不以#!/bin/awk –f开头:第三种方法脚本文件的

awk: (FILENAME=- FNR=1) 致命错误: 试图访问字段 -2

执行:awk '{print $(NF-2)}' aa.log 出现错误:awk: (FILENAME=aa.log FNR=1) 致命错误: 试图访问字段 -2 可能和aa.log中数据有关系: 改为: awk 'NF>1{print $(NF-2)}' aa.log