linux shell之awk

0. 原文迁移

linux shell之awkhttps://blog.csdn.net/iflink/article/details/122388805


awk是Linux Shell文本分析工具之一,功能非常强大。其中,在文本文件处理以及报表生成上, awk是无可替代的。

1. 基本介绍

文件解析依据,awk认为文本文件都是结构化的。何为结构化呢?也就是,定义每个输入行为一条记录,而行中每个字符串定义为一个域(或者段),域与域之间使用分割符界定。主要用途,包括流控制、数学运算、进程控制、内置的变量和函数、循环和判断。

1.1. 工作原理

awk对每行进行拆分,用相应命令对拆分出来的“段”进行处理。

  1. 行工作模式,读入文件的每一行,会把一行的内容,存到$0
  2. 使用内置的变量FS(段分隔符,默认用的是空白字符)分割行,把分割出来的每个段存到相应的变量$(1-100)
  3. 输出的时候,按照内置变量OFS(out FS)输出
  4. 读入下一行继续操作
[root@master-zeus ~]# echo "this is a hadoop book" > awk.txt
[root@master-zeus ~]# awk '{print $2,$1,$3,$4,$5}' awk.txt
is this a hadoop book

1.2 代码块

通常情况下,awk只会处理每一输入行,并执行一段代码块。但是,有些需要在awk开始处理输入行之前执行一些内置变量设置初始化,这是就需要用到BEGIN代码块。与之对应的是END代码块,用于在所有输入都处理完成后awk运行的代码块。也就是说,从运行看,awk由处理前调用处理过程处理结束调用组成。其中,处理过程位于BEGIN、END之间。

[root@master-zeus ~]# vim search.awk
BEGIN {
  FS=":"
  print "Init Finish"
}
/root/
{  
  ++rootUserCnt
}
/bash/
{  
  ++bashCnt
}
{
  print "User -> ", $1
}
END {
  print "Account nologin User Sum -> " rootUserCnt
  print "Account contain bash Sum -> " bashCnt
}
[root@master-zeus ~]# awk -f search.awk /etc/passwd
Init Finish
User ->  root
...
Account nologin User Sum -> 3
Account contain bash Sum -> 3

1.3 模式匹配

处理过程中,如果awk发现处理逻辑之前包括正则表达式,那么会进行正则匹配,匹配得上进行相应逻辑处理,其语法如下:

/正则表达式/ {匹配处理逻辑}

1.4 变量

awk与语言类似,也是提供代码编程,比较关键的就是变量定义。awk提供2中变量支持,其中一种是内建变量,其次就是自定义变量。

1.4.1 常用内置变量

内置变量说明
$0当前记录,即一行记录
$1~$n当前记录第n个字段,字段由FS分隔
FS全称Fields Space,输入字段分隔符,默认为空格
NF全称Number Fields,当前记录字段数量,也就是包含多少列
NR全称Number Rows,已读记录数,也就是行号,从1开始
RS全称Rows Space,输入记录分隔符,默认为换行符
OFS全称Output Fields Space,输出字段分隔符,默认也是空格
ORS全称Output Rows Space,输出记录分隔符,默认为换行符
ARGC全称Argument Count,命令行参数个数
ARGV命令行参数数组
FILENAME当前记录文件名
IGNORECASE如果为真,匹配忽略大小写
ARGIND当前被处理文件ARGV标志符
CONVFMT数字转换格式,默认%.6g
ENVIRONUNIX环境变量
ERRNOUNIX系统错误消息
FIELDWIDTHS输入字段宽度空白分隔字符串
FNR当前记录数
OFMT数字的输出格式,默认%.6g
RSTART被匹配函数匹配的字符串首
RLENGTH被匹配函数匹配的字符串长度
SUBSEP\034

1.4.2 自定义变量

awk中,自定义变量包括数组数值,变量不需要先申明自使用。对于数组,awk支持数字或者字符串作为索引,其语法如下:

   变量名[数字/字符串]=值

对于数值变量,直接对其进行操作处理,但需要注意的是,awk在使用变量时都会有一个空字符串初始值,但需要数值时,会自动变为0。数值变量申明语法如下:

   变量名=值

2. 输出

awk中,如果需要将内容输出,可以调用print或者printf进行输出。需要注意的是,只有printf才能进行format输出。

[root@master-zeus ~]# echo 23.22 11.22 123.3 \
| awk '{printf "%.2f %.2f %.2f\n", $1, $2, $3}'
23.22 11.22 123.30
[root@master-zeus ~]# echo 23.22 11.22 12.33 | awk '{print $1, $2, $3}'
23.22 11.22 12.33

其中,printf format如下:

格式化说明
%cASCII字符
%s字符串
%d十进制整数
%ld十进制长整数
%u十进制无符号整数
%lu十进制无符号长整数
%x十六进制整数
%lx十六进制长整数
%o八进制整数
%lo八进制长整数
%e科学计数法(e计数法)表示的浮点数
%.mf浮点数,m在这里插入代码片表示小数点位数,可选
%g选用ef中较短的一种形式

printf修饰符:

修饰符说明
-左对齐
+使用defg表达整数时,显示数值符号
#八进制前面加0,十六进制前面加0x
00,而不是空白符填充索要显示的数值

3. 控制语句

awk作为一门语言,自然支持语言的3种基本元素:顺序、判断和循环。

3.1 if语句

语法:

if(表达式) {
  代码块
} else if(表达式) {
  代码块
} else {
  代码块
}

3.2 while条件

语法一:

while(表达式) {
  代码块
}

语法二:

do {
  代码块
} while(表达式)

3.3 for循环

语法:

for(初始化段; 表达式; 增量) {
  代码块
}

3.4 break/continue

breakcontinue,可以集合while或者for跳出循环,其中break表示跳出循环,continue表示跳入下次循环。

4. 自定义函数

语法:

function 函数名(参数) {
  代码块
  return 返回值
}

注意,自定义函数需要放在BEGIN之前。

5. 字符串函数

函数描述
sub(/reg/, new_substr, str)替换匹配第一个字符串,返回替换数量
gsub(/reg/, new_substr, str)替换所有匹配的字符串,返回替换数量
index(str, substr)返回substr在str中的索引
length(str)返回字符串长度
match(str, /reg/)如果能从str中找到匹配的字符串,则返回匹配的位置,否则返回0
split(str, array, sep)拆分字符串
substr(str, start, [length])获取指定位置子串
tolower(str)转换字符串为小写
toupper(str)转换字符串为大写
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值