[Linux]awk RSTART,RLENGTH
转自 http://blog.sina.com.cn/s/blog_6d76c7e20102v381.html
awk 是一门非常优秀的文本处理工具,甚至可以上升作为一门程序设计语言。
它处理文本的速度是快得惊人的,现在很多基于shell 日志分析工具都可以用它完成。特点是设计简单,速度表现很好,本文将介绍awk内置变量。
格式: awk [ -F re] [parameter...] ['pattern {action}' ] [-f progfile][in_file...]
一、内置变量
| 属 性 | 说 明 |
| $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 |
Built-in variables
Awk's built-in variables include the field variables: $1, $2, $3, and so on ($0 represents the entire record). They hold the text or values in the individual text-fields in a record.
Other variables include:
- NR: Keeps a current count of the number of input records.
- NF: Keeps a count of the number of fields in an input record. The last field in the input record can be designated by $NF.
- FS: Contains the "field separator" character used to divide fields on the input record. The default, "white space", includes any space and tab characters. FS can be reassigned to another character to change the field separator.
- RS: Stores the current "record separator" character. Since, by default, an input line is the input record, the default record separator character is a "newline".
- OFS: Stores the "output field separator", which separates the fields when Awk prints them. The default is a "space" character.
- ORS: Stores the "output record separator", which separates the output records when Awk prints them. The default is a "newline" character.
- OFMT: Stores the format for numeric output. The default format is "%.6g".
- FILENAME: Contains the name of the current input-file.
二、 变量实例
1) 常用操作
awk '/^root/ {print $0}' /etc/passwd
结果: root:x:0:0:root:/root:/bin/bash # /^root/ 为正则过滤表达式,$0代表是逐行
2) FS 分隔符
awk 'BEGIN{FS=":"} /^root/ {print $1,$NF}' /etc/passwd
结果: root /bin/bash
注: FS为字段分隔符,默认是空格。因为passwd里是”:”分隔,所以需要修改默认分隔符。NF是字段总数,$0代表当前行记录,$1-$n是当前行各个字段对应值,$NF代表最后一列。
3) 记录条数(NR,FNR)
awk 'BEGIN{FS=":"}{print NR, $1, $NF, "\t", $0}' /etc/passwd
结果:
1 root /bin/bash root:x:0:0:root:/root:/bin/bash
2 daemon /bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 bin /bin/sh bin:x:2:2:bin:/bin:/bin/sh
4 sys /bin/sh sys:x:3:3:sys:/dev:/bin/sh
5 sync /bin/sync sync:x:4:65534:sync:/bin:/bin/sync
........
awk 'BEGIN{FS=":"}/^s/{print NR, $1, $NF, "\t", $0}' /etc/passwd # 过滤以首字符”s“开头的所有行
结果:
4 sys /bin/sh sys:x:3:3:sys:/dev:/bin/sh
5 sync /bin/sync sync:x:4:65534:sync:/bin:/bin/sync
20 syslog /bin/false syslog:x:101:103::/home/syslog:/bin/false
........
注: NR得到当前记录所在行
4) 字段分隔符(OFS)
awk 'BEGIN{FS=":"; OFS="##"} /^root/ {print FNR, $1, $NF}' /etc/passwd
结果: 1##root##/bin/bash
注: OFS设置默认字段分隔符, FNR当前记录行
5) 行记录分隔符(ORS)
awk 'BEGIN{FS=":"; ORS="##"}{print FNR, $1, $NF}' /etc/passwd
结果: 1 root /bin/bash##2 daemon /bin/sh##3 bin /bin/sh##4 sys /bin/sh##5 sync /bin/sync##......
awk 'BEGIN{FS=":"; ORS="\n"}{print FNR, $1, $NF}' /etc/passwd # "/n" 是linux 中换行符
结果:
1 root /bin/bash
2 daemon /bin/sh
3 bin /bin/sh
4 sys /bin/sh
5 sync /bin/sync
.......
注: ORS默认是换行符,这里修改为:”##”,所有行之间用”##”分隔了
6) 参数获取(ARGC ,ARGV)
awk 'BEGIN{FS=":"; print "ARGC="ARGC; for(k in ARGV) {print k"="ARGV[k];}}' /etc/passwd
结果:
ARGC=2
0=awk
1=/etc/passwd
注: ARGC得到所有输入参数个数,ARGV获得输入参数内容是一个数组
7) 获得传入的文件名(FILENAME)
awk 'BEGIN{FS=":";}/^r/ {print FILENAME, "\t", $0}' /etc/passwd
结果:
/etc/passwd root:x:0:0:root:/root:/bin/bash
/etc/passwd rtkit:x:110:117:RealtimeKit,,,:/proc:/bin/false
注: FILENAME, $0-$N,NF 不能使用在BEGIN中,BEGIN中不能获得任何与文件记录操作的变量
8) 获得linux环境变量(ENVIRON)
awk 'BEGIN{print ENVIRON["PATH"];}' /etc/passwd
结果: /home/homer/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
注: ENVIRON是子典型数组,可以通过对应键值获得它的值,linux 环境变量还有$HOME,$PWD等,可以通过linux 命令 env 查看
9) 输出数据格式设置(OFMT)
awk 'BEGIN{OFMT="%.3f"; print 1, 2.0, 3.1, 2/3, 123.11111111;}' /etc/passwd
结果: 1 2 3.100 0.667 123.111
注: OFMT默认输出格式是:%.6g 保留六位小数,这里修改OFMT会修改默认数据输出格式,如保留三位小数
10) 按宽度指定分隔符(FIELDWIDTHS)
echo 20130108122448 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 3"}{print $1"-"$2"-"$3, $4":"$5":"$6}'
结果: 2013-01-08 12:24:48
注: FIELDWIDTHS其格式为空格分隔的一串数字,用以对记录进行域的分隔,FIELDWIDTHS="4 2 2 2 2 2"就表示$1宽度是4,$2是2,$3是2 .... 这个时候会忽略FS分隔符
11) RSTART,RLENGTH使用
awk 'BEGIN{start=match("this is 1 teststr", /[a-z]+$/); print start, RSTART, RLENGTH }'
结果: 11 11 7
awk 'BEGIN{start=match("this is a test",/^[a-z ]+$/); print start, RSTART, RLENGTH }'
结果: 0 0 -1
awk 'BEGIN{start=match("this is a test",/^[a-z ]+$/); print start, RSTART, RLENGTH }'
结果: 1 1 14 # 增加了一个空格“ ”匹配
注: RSTART 被匹配正则表达式首位置,RLENGTH 匹配字符长度,没有找到为-1
三、外部变量
1) 基本用法
awk 中两个特别的表达式,BEGIN和END
这两者都可用于pattern中,提供BEGIN和END的作用是给程序赋予 初始状态 和 程序结束 之后执行一些扫尾的工作。
a) 任何在BEGIN之后列出的操作(在{}内),将在awk开始扫描输入之前执行
b) 任何在END之后列出的操作,将在扫描完全部的输入之后执行
因此,通常使用BEGIN来显示变量和初始化变量,使用END来输出最终结果。
示例: echo 'awk test' | awk 'BEGIN{print "start...."} {print $0} END{print "end...."}'
结果:
start....
awk test
end....
2) 获取外部变量
格式如: awk ‘{action}’ 变量名=变量值 ,这样传入变量可以在action中获得值。
示例:
test='awk test'
echo | awk '{print test}' test="$test"
结果: awk test
echo | awk test="$test" '{print test}'
结果: awk: cmd. line:1: fatal: cannot open file `{print test}' for reading (No such file or directory)
注:变量名与值放到’{action}’后面,即 test="$test" 在 print 后面
3) BEGIN程序块中变量
格式如:awk –v 变量名=变量值 [–v 变量2=值2 …] 'BEGIN{action}’
示例:
test='awk test'
echo | awk -v test="$test" 'BEGIN{print test}'
结果: awk test
echo | awk -v test="$test" '{print test}'
结果: awk test
注:用-v 传入变量,可以在3中类型的action 中都可以获得到,但顺序在 action前面
4) 外部环境变量
awk 'BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}'
结果:
HLVL=1
PWD=/home/homer
JAVA_HOME=/home/homer/eclipse/jdk1.7.0_05
SHELL=/bin/bash
PATH=/home/homer/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
..........
注: ENVIRON是子典型数组,可以通过对应键值获得它的值,linux 环境变量还有$HOME,$PWD等,可以通过linux 命令 env 查看
[Linux]awk RSTART,RLENGTH的更多相关文章
- linux awk命令详解,使用system来内嵌系统命令, awk合并两列
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- linux awk 一看就懂
awk是什么 awk是linux环境下的一个命令行工具,但是由于awk强大的能力,我们可以为awk工具传递一个字符串,该字符串的内容类似一种编程语言的语法,我们可以称其为Awk语言,而awk工具本身则 ...
- Linux awk命令详解??????????(研究)
http://blog.chinaunix.net/uid-25120309-id-3801250.html 一. AWK 说明 awk是一种编程语言,用于在linux/unix下对文本和数据进行 ...
- linux awk浅析(转)
Awk 是一种非常好的语言,同时有一个非常奇怪的名称.在本系列(共三篇文章)的第一篇文章中,Daniel Robbins 将使您迅速掌握 awk 编程技巧.随着本系列的进展,将讨论更高级的主题,最后将 ...
- linux awk(good)
一个用awk处理字符串的例子: #!/bin/bash source="nokia201703148855" preffixStr=$(echo $source |awk '{pr ...
- Linux基础教程 linux awk内置变量使用介绍
awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是兄弟连Linux培训 给大家介绍的awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个 ...
- [Linux] AWK命令详解(大全)
转载自:http://caoyanbao.iteye.com/blog/570868 什么是awk? 你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk ...
- Linux awk学习
零.awk标准语法 [root@wohaoshuai1 bbb]# echo "abcd" |awk 'BEGIN{print "wohaoshuai"} /a ...
- Linux awk 命令
AWK是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Fam ...
随机推荐
- MyBatis 源码篇-整体架构
MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层 ...
- hdu 3364 高斯入门。。
扣了一个高斯的介绍 比较全面(来自http://blog.csdn.net/duanxian0621/article/details/7408887) 高斯消元法,是线性代数中的一个算法,可用来求解线 ...
- mac电脑开机键盘和鼠标失灵
今天早上电脑刚开机发现,触摸板动不了了,过了一会屏幕上就出现蓝牙键盘连接不了的东东,马上意识到键盘也输入不了了.本来还以为得去守候维修了,百度了下解决方法,好在暂时解决了.亲测有效的两个方法(早上晚上 ...
- 关于Visual Studio 2019安装时共享组件、工具和 SDK安装位置不能更改的问题
解决办法: 更改注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\Setup下的SharedInstallationPath项为所要的路径
- python selenium4 模拟点击+拖动+保存验证码 测试对象+以验证码的返回ID保存命名 58同城验证码
#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/10347899@qq ...
- [NOIP2018模拟赛10.19]只会暴力报告
闲扯 今天又是暴力满满(并不)的一天呢 昨天老师说了分数要正态分布,今天看起来...不过暴力分很多,虽然我人太傻逼又没打满 T1 woc?不是说送分的吗,看起来又是个树形DP神题,暴力告辞,链上的搞一 ...
- [转载]关于Pretrain、Fine-tuning
[转载]关于Pretrain.Fine-tuning 这两种tricks的意思其实就是字面意思,pre-train(预训练)和fine -tuning(微调) 来源:https://blog.csdn ...
- GoBelieve service部署问题整理
- 每日一句 Linux, 持续精进
每日一句 Linux, 持续更新 2019.12.10 1.远程登录 linux 服务器.首先要按照ssh(win10默认是安装了的).命令行窗口,使用 ssh 登录名@serverIp,之后输入密码 ...
- About Spring MVC
一.简介 1.Springmvc是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解 ...