linux 命令之awk

awk 是一个强大的文本分析工具,把文件逐行的读入,以空格为默认分割符将每行切片,切开的部分再进行各种分析处理。

awk命令形式:

awk [-F | -f | -v] `BEGIN{} // {command1;command2;....;commandN} END{}` file

[-F | -f | -v]   : 大参数,-F指定分隔符,-f调用脚本,-v定义变量

` `  :  引用代码块

BEGIN : 初始化代码块,在对每一行进行处理之前,初始化代码,(在脚本中主要是引用全局变量,设置FS分隔符)

//    :   匹配样式,可以是字符串或者正则表达式

{}    :  命令代码块,包含一条或者多条命令

;  : 多条命令使用分号分隔

 END : 结尾代码块,在对每一行进行处理之后在执行的代码块,主要是进行最终计算或输出结尾摘要信息。

awk 支持的算术运算:

+  -   *  /  ^  %  ++ -- += -= *=  /= %= 

awk 内置变量:

$0                  表示整个当前行

$n                  每行第n个字段,n不能为0

NF                 字段数量变量

NR                 每行的记录号,多文件处理是记录递增

FNR               每行的记录号,多文件处理时不递增,每个文件都从1开始

FS                  BEGIN时定义分隔符

RS                 输入的记录分隔符,默认为换行符

OFS               输出字段分隔符,默认是空格

ORS              输出记录的分隔符,默认是换行符

示例文件emp_names
$ cat emp_names
46013     DURHAM JEFF      MOBILE     AL
46015     STEEN BILL       MOBILE     AL
46017     FELDMAN EVAN     MOBILE     AL
46018     SWIM STEVE       UNKNOWN    AL
46019     BOGUE ROBERT     PHOENIX    AZ
46021     JUNE MICAH       PHOENIX    AZ
46022     KANE SHERYL      UNKNOWN    AR
46024     WOOD WILLIAM     MUNCIE     IN
46026     FERGUS SARAH     MUNCIE     IN
46027     BUCK SARAH       MUNCIE     IN
46029     TUTTLE BOB       MUNCIE     IN
$ awk '{print $0}' emp_names    #打印文件emp_names中的所有字段
46013     DURHAM JEFF      MOBILE     AL
46015     STEEN BILL       MOBILE     AL
46017     FELDMAN EVAN     MOBILE     AL
46018     SWIM STEVE       UNKNOWN    AL
46019     BOGUE ROBERT     PHOENIX    AZ
46021     JUNE MICAH       PHOENIX    AZ
46022     KANE SHERYL      UNKNOWN    AR
46024     WOOD WILLIAM     MUNCIE     IN
46026     FERGUS SARAH     MUNCIE     IN
46027     BUCK SARAH       MUNCIE     IN
46029     TUTTLE BOB       MUNCIE     IN
$ awk '{print $1,$2,$3,$4,$5}' emp_names   #打印文件emp_names中多个字段
46013 DURHAM JEFF MOBILE AL
46015 STEEN BILL MOBILE AL
46017 FELDMAN EVAN MOBILE AL
46018 SWIM STEVE UNKNOWN AL
46019 BOGUE ROBERT PHOENIX AZ
46021 JUNE MICAH PHOENIX AZ
46022 KANE SHERYL UNKNOWN AR
46024 WOOD WILLIAM MUNCIE IN
46026 FERGUS SARAH MUNCIE IN
46027 BUCK SARAH MUNCIE IN
46029 TUTTLE BOB MUNCIE IN
$ awk '/AL|AZ/ {print $3,$2,$5}' emp_names #打印文件emp_names中匹配AL 、 AZ样式的多个字段
JEFF DURHAM AL
BILL STEEN AL
EVAN FELDMAN AL
STEVE SWIM AL
ROBERT BOGUE AZ
MICAH JUNE AZ
$ awk '$5~/AR/' emp_names  #在第5个字段中匹配样式,没有指定打印字段,则打印所有字段
46022     KANE SHERYL      UNKNOWN    AR
$ awk '$5!~/AR/' emp_names #在第5个字段中匹配样式,打印出不匹配的所有行(没有指定打印字段,打印所有字段)
46013     DURHAM JEFF      MOBILE     AL
46015     STEEN BILL       MOBILE     AL
46017     FELDMAN EVAN     MOBILE     AL
46018     SWIM STEVE       UNKNOWN    AL
46019     BOGUE ROBERT     PHOENIX    AZ
46021     JUNE MICAH       PHOENIX    AZ
46024     WOOD WILLIAM     MUNCIE     IN
46026     FERGUS SARAH     MUNCIE     IN
46027     BUCK SARAH       MUNCIE     IN
46029     TUTTLE BOB       MUNCIE     IN
$ awk '$5~/AR/ {print $1 ; print $2 ; print $3}' emp_names #将一行中多个字段分行打印
46022
KANE
SHERYL
$ awk '{print $0 | "sort > /tmp/filez"} ' emp_names  #将文件emp_names中字段排序,重定向到/tmp/filez文件中
$ cat /tmp/filez
46011     TUTTLE BOB       MUNCIE     IN
46012     STEEN BILL       MOBILE     AL
46013     DURHAM JEFF      MOBILE     AL
46017     FELDMAN EVAN     MOBILE     AL
46018     BOGUE ROBERT     PHOENIX    AZ
46019     SWIM STEVE       UNKNOWN    AL
46021     JUNE MICAH       PHOENIX    AZ
46022     KANE SHERYL      UNKNOWN    AR
46027     BUCK SARAH       MUNCIE     IN
46030     FERGUS SARAH     MUNCIE     IN
46045     WOOD WILLIAM     MUNCIE     IN

$ awk -F":" '{print $1}' /etc/passwd   #/etc/passwd是系统自带文件  每行是用:分隔字符,所以需要指定分隔符 也可以使用  awk '{FS=":"} {print $1}' /etc/passwd   这样结果是一样的
root
daemon
bin
sys
sync
games
man
lp
mail
news
...
$ cat awk.list
BEGIN{FS=":"}
{print $1}
$ awk -f awk.list /etc/passwd  #使用-f调用awk脚本
root
daemon
bin
sys
sync
games
man
lp
$ awk '{FS=":"} {OFS="-"}{print $1,$3}' /etc/passwd #指定输出字段分隔符
root:x:0:0:root:/root:/bin/bash-
daemon-1
bin-2
sys-3
sync-4
games-5
man-6
lp-7
$ awk -F":" '{print "USER_NAME: "$1, "\nNUMBER: "$3}' /etc/passwd  #按照自己想要的格式与内容输出
USER_NAME: root
NUMBER: 0
USER_NAME: daemon
NUMBER: 1
USER_NAME: bin
NUMBER: 2
USER_NAME: sys
NUMBER: 3
USER_NAME: sync
NUMBER: 4
USER_NAME: games
NUMBER: 5

示例文件内容
$ cat inventory
hammers	5	7.99
drills	2	29.99
punches	7	3.59
drifts	2	4.09
bits	55	1.19
saws	123	14.99
nails	800	.19
screws	80	.29
brads	100	.24
$ awk 'BEGIN {print "ITEM\tQUANTITY\tPRICE\tTOTAL"} {x=x+($2*$3)} {print $1"\t"$2"\t\t"$3"\t"$2*$3} END {print "Total Value of Inventory: " x}' inventory
ITEM	QUANTITY	PRICE	TOTAL  #BEGIN关键字
hammers	5		7.99	39.95
drills	2		29.99	59.98
punches	7		3.59	25.13
drifts	2		4.09	8.18
bits	55		1.19	65.45
saws	123		14.99	1843.77
nails	800		.19	152
screws	80		.29	23.2
brads	100		.24	24
Total Value of Inventory: 2241.66     #END关键字 x最后的值

awk本身是一个编程语言,另外还支持if语句,循环语句;用法类似C语言的编程



时间: 2024-10-17 06:22:58

linux 命令之awk的相关文章

Linux命令:awk简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. 备注:awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. 语法: awk [options] 'program' file file ... awk [options] 'PATTERN{action}' file

linux命令:awk文本处理命令

   awk命令简介: awk是一个强大的文本分析工具,通常,awk是以文件的每一行,为处理单位的.awk每接收文件的一行,然后执行相应的命令,来处理文本. 1.命令格式: awk 'pattern {action}' {filenames} 其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所 执行的一系列命令.花括号({})不需要在程序中始终出现,但它们用于根据特定的 模式对一系列指令进行分组. pattern就是要表示的正则表达式,用斜杠括起来.

Linux命令之awk数组使用范例

目录 取ifconfig bond0的IP地址    1 命令如下:    2 统计apache日志单IP访问请求数排名    2 第一种方法    2 第二种方法    2 统计域名访问量    3 第一种方法:    3 第二种方法:    3 计算每个人的总工资和平均工资    4 命令如下:    4 对本地IP和远程IP去重并统计重复数    4 命令如下:    5 统计源IP,端口及目的IP同时去重    6 命令如下:    6 美化效果如下:    7 取ifconfig bo

linux命令之awk

简介 awk命令的名称是取自三位创始人Alfred Aho .Peter Weinberger 和 Brian Kernighan姓名的首字母,awk有自己的程序设计语言,设计简短的程序,读入文件,数据排序,处理数据,生成报表等功能. awk 通常用于文本处理和报表生成,最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作. awk 通常以文件的一行为处理单位的,awk每接收文件的一行,然后执行相应的命令,来处理文本,完整的awk脚本通常用来格式化文本

Linux命令之乐--awk

过滤出mysql的监听端口 netstat -lnt|grep 3306|awk -F '[ :]+' '{printf $5}'

linux命令之 awk, sed, scp

AWK是一种处理文本文件的语言,是一个强大的文本分析工具 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. 使用方法 awk '{pattern + action}' {filenames} 显示最近登录的5个帐号 #last -n 5 | awk '{print $1}' details: http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

【每天一个linux命令】awk

awk:取出指定字符 #[-F ':'] 将查找出的内容以 : 为分割 #[{print $0}] 分割之后打印出第n个值($0 是所有) cat /etc/passwd |awk -F ':' '{print $0}' #[END{print $0}] 以空格分割,打印出最后一行所有值 cat awk.log |awk 'END{print $0}' #[BEGIN{print "begin"} {print $1 "," $7} END{print "

Linux 常用命令sed/awk/grep及正则表达式

linux命令sed和awk sed 主要功能 sed,stream editor.是一个"非交互式"字符流编辑器.输入流通过程序并输出到标准输出端. sed主要用来自动编辑一个或者多个文件(替换,插入,删除,追加,更改) 常见应用 抽区域 匹配正则表达式 比较域 增加,附加,替换 执行过程 sed一次处理一行或多行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区

Linux命令:cp、time、cut、awk 、获取文件大小命令

最近写了一个shell脚本,用到了cp.time.cut.awk命令,把他们的使用方法给写下来: 1.cp和mv cp命令:用来完成文件的复制,从源文件夹复制到目标文件夹.执行后源文件夹和目标文件夹均有源文件. mv 命令:用来移动文件.执行后,源文件夹中没有源文件.我经常用mv命令来重命名文件 注意:cp命令源文件夹与目标文件夹不能使同一个:而在mv中可以是同一个. 命令解析: #cp [-R] 源文件 目标文件夹 cp -R 参数 ---当复制整个文件夹时使用. #mv 源文件 目标文件夹