概述

awk(分析&处理)
awk是一个数据处理工具,相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分成数个”字段“来处理。

通常运行模式:

 awk ' 条件类型1{动作1} 条件类型2{动作2}...‘ filenameawk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } file


awk 内置变量使用

内置变量表

属性 说明
$0 当前记录(作为单个变量)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始
RS 输入的记录他隔符默 认为换行符
OFS 输出字段分隔符 默认也是空格
ORS 输出的记录分隔符,默认为换行符
ARGC 命令行参数个数
ARGV 命令行参数数组
FILENAME 当前输入文件的名字
IGNORECASE 如果为真,则进行忽略大小写的匹配
ARGIND 当前被处理文件的ARGV标志符
CONVFMT 数字转换格式 %.6g
ENVIRON UNIX环境变量
ERRNO UNIX系统错误消息
FIELDWIDTHS 输入字段宽度的空白分隔字符串
FNR 当前记录数
OFMT 数字的输出格式(默认值是%.6g)
RSTART 被匹配函数匹配的字符串首
RLENGTH 被匹配函数匹配的字符串长度
SUBSEP 数组下标分隔符(默认值是\034)

栗子

以下操作的数据来源为/etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
...........

root开头的那一行

[root@entel2 ~]# awk '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

/^root/ 为选择表达式,
^root表示以root开头

$0 代表整行 $1代表第一个区域,依此类推

设置字段分隔符号(FS使用方法)

[root@entel2 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
root /bin/bash[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $2,$NF}' /etc/passwd
x /bin/bash[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $0,$NF}' /etc/passwd
root:x:0:0:root:/root:/bin/bash /bin/bash[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print $6,$NF}' /etc/passwd
/root /bin/bash

FS为字段分隔符,可以自己设置,默认是空格,因为passwd里面是”:”分隔,所以需要修改默认分隔符。

NF是字段总数,$0代表当前行记录,$1-$n是当前行,各个字段对应值。

$NF 最后一列的值。


记录条数(NR,FNR使用方法)

[root@entel2 ~]# awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
1 root /bin/bash
2 bin /sbin/nologin
3 daemon /sbin/nologin
4 adm /sbin/nologin
5 lp /sbin/nologin
6 sync /bin/sync
7 shutdown /sbin/shutdown
8 halt /sbin/halt
9 mail /sbin/nologin
10 uucp /sbin/nologin
........

设置输出字段分隔符(OFS使用方法)

指定分隔符为^^
[root@entel2 ~]#  awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
1^^root^^/bin/bash默认字段分隔符:
[root@entel2 ~]#  awk 'BEGIN{FS=":"}/^root/{print FNR,$1,$NF}' /etc/passwd
1 root /bin/bash

OFS设置默认字段分隔符


设置输出行记录分隔符(ORS使用方法)

cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}'
[root@entel2 ~]# cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}'
1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^4 adm /sbin/nologin^^5 lp /sbin/nologin^^

ORS默认是换行符,这里修改为:”^^”,所有行之间用”^^”分隔了。


输入参数获取(ARGC ,ARGV使用)

[root@entel2 ~]#  awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' /etc/passwd
ARGC=2
0=awk
1=/etc/passwd[root@entel2 ~]# awk 'BEGIN{FS=":";print "NUM="ARGC;for(k in ARGV){print k"="ARGV[k];}}' /etc/passwd
NUM=2
0=awk
1=/etc/passwd

ARGC得到所有输入参数个数,ARGV获得输入参数内容,是一个数组。


获得传入的文件名(FILENAME使用)

[root@entel2 ~]# awk 'BEGIN{FS=":";print FILENAME}/^root/{print FILENAME}' /etc/passwd/etc/passwd

可见 第一行并没有打印出 /etc/passwd

FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能获得任何与文件记录操作的变量。

获得linux环境变量(ENVIRON使用)

[root@entel2 ~]# awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd
.:/oracle/oracle11/product/112/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

输出数据格式设置:(OFMT使用)

[root@entel2 ~]# awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111;}' /etc/passwd
0.667 123.111默认的
[root@entel2 ~]# awk 'BEGIN{OFMT="%.6f";print 2/3,123.11111111;}' /etc/passwd
0.666667 123.111111

OFMT默认输出格式是:%.6g 保留六位小数,这里修改OFMT会修改默认数据输出格式。

按宽度指定分隔符(FIELDWIDTHS使用)

[root@entel2 ~]# echo 20160922231258 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 2"}{print $1"-"$2"-"$3,$4":"$5":"$6}'
2016-09-22 23:12:58

FIELDWIDTHS其格式为空格分隔的一串数字,用以对记录进行域的分隔,FIELDWIDTHS=”4 2 2 2 2 2”就表示$1宽度是4,$2是2,$3是2 …. 。这个时候会忽略:FS分隔符。

RSTART RLENGTH使用

[root@entel2 ~]# awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
11 11 4[root@entel2 ~]# awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }'
0 0 -1

RSTART 被匹配正则表达式首位置,RLENGTH 匹配字符长度,没有找到为-1.


Linux-awk及内置变量相关推荐

  1. awk NR详解!awk 的内置变量 NF、NR、FNR、FS、OFS、RS、ORS

    NF 字段个数,(读取的列数) NR 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始 FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数 FS 输入字段分隔符,默 ...

  2. awk 的内置变量 NF、NR、FNR、FS、OFS、RS、ORS

    NF 字段个数,(读取的列数) NR 记录数(行号),从1开始,新的文件延续上面的计数,新文件不从1开始 FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数 FS 输入字段分隔符,默 ...

  3. linux make makefile 内置变量 默认变量

    在看uboot的Makefile的时候,发现CURDIR这个变量没有定义就直接用了,于是百度了一下,原来CURDIR是Makefile的一个内置变量,在这里顺便把其他的变量也记录一下. 打印变量值使用 ...

  4. linux shell bash 内置变量参考

    特殊的shell变量 变 量 含义 $0 脚 本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置参数的个数 "$*" ...

  5. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

  6. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

  7. linux awk 内置变量使用介绍

    awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...

  8. linux内置变量大全,(转)linux awk 内置变量使用介绍

    awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...

  9. linux awk 内置变量实例

    awk 是一门非常优秀的文本处理工具,甚至可以上升作为一门程序设计语言. 它处理文本的速度是快得惊人的,现在很多基于shell 日志分析工具都可以用它完成.特点是设计简单,速度表现很好,本文将介绍aw ...

  10. awk 内置变量与自定义变量

    点击上方"生信科技爱好者",马上关注真爱,请置顶或星标 作者:ghostwu 原文:https://www.cnblogs.com/ghostwu/p/9085653.html A ...

最新文章

  1. php对二维数据排序
  2. 9.QT事件机制源码时序分析(上)
  3. UML精粹--标准对象建模语言简明教程
  4. iphone图片编辑画笔_苹果超强新功能上线!它打开了 iPhone 摄影的新大门
  5. android代码导入有错误,android新项目导入后进行编译出现cmake错误
  6. SpringMVC教程下篇
  7. centos 使用yum 安装出现 File contains no section headers 错误解决方法
  8. python开发效率怎样提高_python 提高开发效率的5个小技巧
  9. Zabbix系统端口监控状态
  10. 关于使用stanfordcorenlp一直运行不报错的解决方法
  11. (IT)这个行当里你应该知道的10个小秘密
  12. 计算机组成原理--白中英版 全部知识点
  13. CodeForces 584 D.Dima and Lisa(数论)
  14. SNIFFER(嗅探器)-简介(zt)
  15. c# 如何调用java的wsdl文件,C#客户端如何调用wsdl文件
  16. 音乐播放器app android,mp3音乐播放器
  17. 深蓝学院-多传感器融合定位-第4章作业
  18. 线性代数【10】 相似矩阵
  19. QT 插入视频并实现循环播放
  20. 记账APP:小哈记账3——登录页面的制作

热门文章

  1. python 自然语言处理(三)获取词性
  2. 与虫子尾交3d动画网站_PPT中最酷的效果 —— 3D模型全解
  3. 边界都是1的最大正方形大小
  4. 报错笔记:linux 命令行中的print输出内容无法重定向到文件中
  5. Flink从入门到精通100篇(二)-在Linux中完整安装flink并做Flink文件的配置
  6. java 删除list元素_JAVA中循环删除list中元素的方法总结
  7. python实现文件上传预览_Python文件上传功能简单实现
  8. 如何把本地项目上传到Github上面(详细版)
  9. VirtraulBox中安装Ubuntu16.04
  10. #论文 《Deep Residual Learning for Image Recognition》