awk累加命令 linux
2019-01-16 15:59:00 weixin_30724853 阅读数 1

1

转载于:https://www.cnblogs.com/zhanzhuang/p/10277533.html

2016-08-22 15:09:49 zhuangtim1987 阅读数 196
awk是一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的。awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域(段),域和域之间使用分割符分割。

awk 会把每行进行一个拆分,用相应的命令对拆分出来的“段”进行处理。
(1)行工作模式,读入文件的每一行,会把一行的内容,存到$0里
(2)使用内置的变量FS(段的分隔符,默认用的是空白字符),分割这一行,把分割出来的每个段存到相应的变量$(1-100)
(3)输出的时候按照内置变量OFS(out FS),输出
(4)读入下一行继续操作

简单实例
[root@tx3 ~]# echo "this is a book" > awk.txt
[root@tx3 ~]# awk '{print $2,$1,$3,$4}' awk.txt
is this a book



常见内置变量表
1 $0             当前记录(作为单个变量)  
2 $1~$n          当前记录的第n个字段,字段间由FS分隔  
3 FS             输入字段分隔符 默认是空格  
4 NF             当前记录中的字段个数,就是有多少列  
5 NR             已经读出的记录数,就是行号,从1开始  
6 RS             输入的记录他隔符默 认为换行符  
7 OFS            输出字段分隔符 默认也是空格  
8 ORS            输出的记录分隔符,默认为换行符  
9 ARGC           命令行参数个数  
10 ARGV           命令行参数数组  
11 FILENAME       当前输入文件的名字  
12 IGNORECASE     如果为真,则进行忽略大小写的匹配  
13 ARGIND         当前被处理文件的ARGV标志符  
14 CONVFMT        数字转换格式 %.6g  
15 ENVIRON        UNIX环境变量  
16 ERRNO          UNIX系统错误消息  
17 FIELDWIDTHS    输入字段宽度的空白分隔字符串  
18 FNR            当前记录数  
19 OFMT           数字的输出格式 %.6g  
20 RSTART         被匹配函数匹配的字符串首  
21 RLENGTH        被匹配函数匹配的字符串长度 



awk print例子
例:打印整行: $0
[root@tx3 ~]# cp /etc/passwd p1
[root@tx3 ~]# awk '{print $0}' p1

例:打印每行的最后一个字段: $NF
[root@tx3 ~]# awk -F : '{print $NF}' p1

例:打印第三个字段: $3
[root@tx3 ~]# awk -F : '{print $3}' p1

例:打印第一行NR==1
[root@tx3 ~]# awk 'NR==1{print $0}' p1
root:x:0:0:root:/root:/bin/bash

例:打印最后一行
[root@tx3 ~]# awk 'END{print $0}' p1
tx:x:500:500:tx:/home/tx:/bin/bash

例:打印第一行最后一个字段
[root@tx3 ~]# awk -F: 'NR==1{print $NF}' p1
/bin/bash

例:打印最后一行最后一个字段
[root@tx3 ~]#awk -F: 'END{print $NF}' p1

例:打印每行的倒数第二个字段,并在其后打印你好
[root@tx3 ~]# awk -F: '{print $(NF-1),"nihao"}' p1
/root nihao
/bin nihao
/sbin nihao

例:打印行号
[root@tx3 ~]# awk '{print NR,$0}' p1
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

例:打印当前系统环境变量的某个特定值
[root@tx3 ~]# awk 'BEGIN{print ENVIRON["PATH"];}'
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

例: 用:分割,删除第2个字段
[root@tx3 ~]# awk 'BEGIN{FS=":";OFS=":"}{print $1,$3,$4,$5,$6,$7}' p1
root:0:0:root:/root:/bin/bash
bin:1:1:bin:/bin:/sbin/nologin
daemon:2:2:daemon:/sbin:/sbin/nologin


总结:

统计文本                wc
文本排序                sort
文本/目录对比           diff
在文件中查找关键行      grep / sed
在行文本中添、删、改    sed
在列文本中显示指定列    awk
在列文本中进行计算      awk
在列文本进行条件选择    awk



2013-05-18 17:32:44 J2EE_WQS 阅读数 21

sample文件如下, 便于测试:

Heigh-ho! sing, heigh-ho! unto the green holly:
Most friendship is feigning, most loving mere folly:
Then, heigh-ho, the holly!

一. 使用 

1.  显示全部内容:

awk '{ print }'  sample

 解释的过程为如下:

 2. 管道来源:

cat sample | awk '{ print }'

 3. -f参数:

所以,假设一个名为 progfile 的文件中包含下面的内容:

{ print } 

awk -f progfile sample

 上面三个的参数打印的一致.

二. 按照特定的字符进行分割

 

上图为以换行符把Record分割, 在Record内部用空格分割到Filed的逻辑结构. 
1. 使用BEGIN对感叹号 (!) 作为字段分隔符打印示例数据的第 1 个字段:

$ awk ' BEGIN { FS = "!" } { print $1 } ' sample
Heigh-ho
Most friendship is feigning, most loving mere folly:
Then, heigh-ho, the holly
$

2. 使用-F改变分隔符:

#用=分割每行中的两个字符串,并分别打印出来
$vi shell.txt
ruanjianwang=20130101
greatwqs=20130456
eagle=20130202
$ awk -F "=" ' { print $1,$2 } ' shell.txt
ruanjianwang 20130101
greatwqs 20130456
eagle 20130202
$

 

$ awk -F "," ' { print $2 } ' sample
 heigh-ho! unto the green holly:
 most loving mere folly:
 heigh-ho
$
$ awk -F ":" ' { print $5 } ' /etc/passwd
# show user in system

 不能使用-F "!", 特殊字符原因.

 以:分割,第一位用户名,判断用户名为hadoop的行:

$ awk -F ":" '$1 == "hadoop"' /etc/passwd
hadoop:x:501:501::/home/hadoop:/bin/bash
$

大小比较

$ df | awk '$4>1000000 '
Filesystem           1K-blocks      Used Available Use% Mounted on
                       9934940   4960160   4461964  53% /home
tmpfs                  4087664         0   4087664   0% /dev/shm
/dev/sdb1            258027584  11962992 232957564   5% /data
$

 

三. 常见的AWK 变量

 

变量 描述
NF  该变量包含每个记录的字段个数。
NR  该变量包含当前的记录个数。
FS  该变量是字段分隔符。
RS  该变量是记录分隔符。
OFS  该变量是输出字段分隔符(为-F指定的符号,或者2.1中的情形)。
ORS  该变量是输出记录分隔符(一般为换行符)。
FILENAME  该变量包含所读取的输入文件的名称。
IGNORECASE  当 IGNORECASE 设置为非空值,GAWK 将忽略模式匹配中的大小写。 

1. NR测试(这里打印的1,2,3:相当于行号:起始为1):

$ awk '{ print NR, $NR }' sample
1 Heigh-ho!
2 friendship
3 the
$

NR为包含的记录个数,这里用行进行了分割,即上图中的Recode.  $NR 为显示参数,

2. NR和NF测试:

NF为每个Recode中根据字符串拆分后的字段(编号,起始为1)

$ awk ' { print "Record " NR " has " NF " fields and ends with " $NF}' sample
Record 1 has 7 fields and ends with holly:
Record 2 has 8 fields and ends with folly:
Record 3 has 4 fields and ends with holly!

四. 常用的 GAWK 语句

语句 描述
exit 停止程序的执行,并且退出。
next 停止处理当前记录,并且前进到下一条记录。
nextfile 停止处理当前文件,并且前进到下一个文件。
print 打印使用引号括起来的文本、记录、字段和变量。(缺省情况下是打印出当前整行记录。)
printf 打印格式化文本,类似于它的 C 语言对等成分,但必须指定结尾的换行。
sprintf

返回格式化文本字符串,与 printf 使用相同的格式。

很多时候用print

参考:

http://blog.csdn.net/tianlesoftware/article/details/6278273

http://www.ibm.com/developerworks/cn/education/aix/au-gawk/index.html

2016-09-04 12:55:00 weixin_30294709 阅读数 6

一、AWK简介

awk:报告生成器,是以行为单位进行处理,并格式化后显示

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

二、AWK变量

2.1 awk内置变量之记录变量

FS: 默认是空白字符,指定输入分隔符
RS: 输入文本信息所使用的换行符
OFS: 输出字符分隔符
ORS: 输出行分隔符
FS or -F
[root@node1
~]# cat test.txt this is a test. [root@node1 ~]# awk -F' ' '{print $0}' test.txt   FS可以使用-F选项,当没有使用-F选项的时候,awk默认-F选项为空格或者tab this is a test.
[root@node1 ~]# awk '{print $0}' test.txt
this is a test.
RS

[root@node1 ~]# cat abc
1|2|3
[root@node1 ~]# awk 'BEGIN{RS="|"}{print $0}' abc   找到"|"符号,将它变成回车
1
2
3
OFS

[root@node1 ~]# cat test.txt 
this is a test.
[root@node1 ~]# awk 'OFS=":"{print $1,$2,$3,$4}' test.txt  将文件的间隔由空格符换成分号
this:is:a:test.
ORS

[root@node1 ~]# cat abc
1
2
3
[root@node1 ~]# awk 'BEGIN{ORS="----\n"}{print $0}' abc   # 输出分隔符号。
1----
2----
3----

 

2.2 awk内置变量之数据变量

NR: awk命令所处理的记录数 :如果有多个文件,这个数目会把处理的多个文件中行统一计数
FNR:与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数
NF: 当前记录的字段个数
[root@node1 ~]# cat  test1  
1
2
3
[root@node1 ~]# cat test2 
1
2
3
4
5

NR

[root@node1 ~]# awk '{print NR}' test1 test2  # 两个文件行数之和
1
2
3
4
5
6
7
8

FNR

[root@node1 ~]# awk '{print FNR}' test1 test2  # 两个文件的行数分别显示出来
1
2
3
1
2
3
4
5
NF

[root@node1 ~]# cat test.txt 
this is a test.
[root@node1 ~]# awk '{print NF}' test.txt    # NF是计算一行中的字段数
4
[root@node1 ~]# awk '{print $NF}' test.txt   # 而$NF则是一行中最后一个字段的简单表示方法
test.

 

三、printf
  printf命令的使用格式:
  printf format,item1,item2,...

要点:
  1、其与print命令的最大不同是,printf需要指定format;
  2、format用于指定后面的每个item的输出格式
  3、printf语句不会自动打印换行符;\n

 

format格式的指定符都以%开头,后跟一个字符,如下:
  %c: 显示字符的ASCII码;
  %s: 显示字符串

修饰符:
  N:显示宽度;
  -:左对齐
  +:显示数值符号


常见模式类型

  1、regexp:正则表达式,格式为/regular expression/
  2、expression:表达式,其值非0或为非空字符串时满足条件,如:$1 ~ /foo/ 或 $1 == "magedu",用运算符~(匹配)和!~(不匹配)
  3、ranges:指定的匹配范围,格式为part1,part2
  4、BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次
  5、Empty(空模式):匹配任意输入行

 

例:取得/etc/passwd中每个用户名和shell格式化显示出来:

[root@node1 ~]# awk -F: '{printf "%-10s %-10s\n",$1,$NF}' /etc/passwd
root       /bin/bash 
bin        /sbin/nologin
daemon     /sbin/nologin
adm        /sbin/nologin

......
[root@node1 ~]# awk -F: 'BEGIN{printf "%-10s %-10s\n","User","Shell"}{printf "%-10s %-10s\n",$1,$NF}' /etc/passwd
User       Shell     
root       /bin/bash 
bin        /sbin/nologin
daemon     /sbin/nologin
adm        /sbin/nologin
lp         /sbin/nologin
......

 

例:获取服务器tcp连接的每种状态数量

[root@node1 ~]# netstat -nat | awk '/^tcp/{++S[$NF]}END{for (i in S){print i,S[i]}}'
ESTABLISHED 3
LISTEN 4

/^tcp/  正则表达式: 匹配以tcp开头的行

{++S[$NF]}  获取每行的最后一个字节添加到数组,此时的S为数组 $NF为下标

END{for (i in S){print i,S[i]}}   处理完成后,通过下标循环打印出 下标 和 变量值
 

转载于:https://www.cnblogs.com/hukey/p/5839062.html

2018-08-30 18:35:00 weixin_33716941 阅读数 9

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

语法

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报告信息的版本。

基本用法

log.txt文本内容如下:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

用法一:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

实例:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

用法二:

awk -F  #-F相当于内置变量FS, 指定分割字符

实例:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

用法三:

awk -v  # 设置变量

实例:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

用法四:

awk -f {awk脚本} {文件名}

实例:

 $ awk -f cal.awk log.txt

运算符

运算符描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ ~! 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / % 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员

过滤第一列大于2的行

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

过滤第一列等于2的行

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

过滤第一列大于2并且第二列等于'Are'的行

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

内建变量

变量描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGIND 命令行中当前文件的位置(从0开始算)
ARGV 包含命令行参数的数组
CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表(用空格键分隔)
FILENAME 当前文件名
FNR 各文件分别计数的行号
FS 字段分隔符(默认是任何空格)
IGNORECASE 如果为真,则进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
OFMT 数字的输出格式(默认值是%.6g)
OFS 输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS 输出记录分隔符(默认值是一个换行符)
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符(默认值是/034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    2    4         4    4
$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

使用正则,字符串匹配

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ 表示模式开始。// 中是模式。

# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

忽略大小写

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

模式取反

$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

awk脚本

关于awk脚本,我们需要注意两个关键词BEGIN和END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件(学生成绩表):

$ cat score.txt
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

我们的awk脚本如下:

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

我们来看一下执行结果:

$ awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00

另外一些实例

AWK的hello world程序为:

BEGIN { print "Hello, world!" }

计算文件大小

$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581

从文件中找出长度大于80的行

awk 'length>80' log.txt

打印九九乘法表

seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

Linux awk 命令

阅读数 428

【Linux 命令】 awk

阅读数 551

linux 命令之 awk

阅读数 146

Linux awk 命令

阅读数 79

Linux AWK 命令

阅读数 61

没有更多推荐了,返回首页