简介

awk是一种处理文本文件的语言,是一个强大的文本编辑工具。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理。

gawk

用法:gawk [options] 'PATTERN{ACTION STATEMENTS}' FILE...

gawk [options]'program'FILE...

program : PATTERN{ACTION STATEMENTS}

选项(options)

-f file :指定awk脚本文件

-F:输入数据时的字段分割符

-v:var=value:自定义变量

分割符、域和记录

awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。

$0为所有域, 注意:和shell中变量$符含义不同

文件的每一行称为记录

省略action,则默认执行 print $0 的操作

示例

从passwd文件中取出user,uid,shell

# awk -F: '{print $1,$3,$7}' /etc/passwd

PATTERN

1)空模式,匹配每一行

2)/正则表达式/:仅处理被模式匹配到的行

3)关系表示式(条件表示式):布尔值类型,结果为真(非0或非空字符串)则处理;结果为假(0或空字符串)则不处理

4)地址定界;支持PATTERN和条件表达式;不支持数字直接定界

5)BEGIN/END模式;BEGIN{}:仅在文本处理之前执行;END{}:仅在文本处理完成之后执

ACTIONS

表达式

三目表达式:selector?if-true-expression:if-false-expression

如果selector为真,则执行if-true-expression;如果selector为假,则执行if-false-expression。

控制语句

1)if-else 语法:if(condition) statement [else statement]

2)while 语法:while(condition) statement 条件真进入循环,条件假退出循环

3)do-while 语法:do statement while(condittion) 先执行一次do,然后判断是否进入循环

4)for 语法:for(variable assignment; condition; iteration process){for-body}

*特殊用法:能够遍历数组中的元素,for(var in array) {for-body}

5)switch 语法:switch(expression) {case VALUE1 or /PEGEXP/: statement; case VALUE2 or /PEGEXP2/: statement; ... ;default: statement}

6)next:控制awk的内生循环,提前结束对本行的处理直接进入下一行

7)continue | break | exit:退出循环,和shell中用法相同

组合语句

组合语句需要将多条语句放到大括号内

输入语句

输出语句

print item1, item2, ... 输出命令

1)逗号为分隔符

2)输出的各item可以是字符串,也可是数值当前记录字段、变量或awk的表达式

3)如果省略item,则相当于print $0

printf FORMAT, item1, item2, ...:格式化输出命令

1)FORMAT必须要给出

2)不会自动换行,需要显示给出换行控制符,\n

3)FORMAT中需要分别为后面的每个item指定一个格式化符号

4)格式符

  • %c:显示字符的ASCII码;
  • %d,%i:显示十进制整数;
  • %e,%E:科学计数法数值显示;
  • %f:显示为浮点数;
  • %g,%G:以科学技术法或浮点数形式显示数值;
  • %s:显示字符串;
  • %u:无符号整数;
  • %%:显示%自身

5)修饰符

  • M[.N]:M控制数组显示的宽度,N控制小数点的精度
  • -:左对齐显示,默认右对齐
  • +:显示数值的符号

变量

内建变量

FS:输入字段分隔符,默认为空白字符

示例:从passwd文件中取出user,uuid,shell

#awk -v FS=":" '{print $1,$3,$7}' /etc/passwd

OFS:输出字段分隔符,默认为空白字符

示例:从passwd文件中取出user,uuid,shell并以“:”为分隔符输出

#awk -v FS=":" -v OFS":"  '{print $1,$3,$7}' /etc/passwd

RS:输入记录分隔符

示例:以空格为换行符打印

# awk -v FS" "  '{print}' /etc/passd

ORS:输出记录分隔符

NF:字段数量;{print $NF}:表示最后字段值

示例:输出每行有多少个字节

# awk '{print NF}' /etc/passwd

NR:行数,对不同文件行数累加计数

示例:输出文件行号(有多少行)

# awk '{print NR}' /etc/passwd 

FNR:行数,对不同文件行数分别计数

示例:两个个文件分别打印行号

# awk -F: '{print FNR}' /etc/passwd /etc/fstab

FILENAME:显示当前文件名

ARGC:命令行参数个数

示例:打印命令行有几个参数

# awk -F: 'BEGIN{print ARGC}' /etc/passwd /etc/fstab

ARGV:数组,保存的是命令行中给定的各参数,使用ARGV[#]引用

示例:打印命令行第1个参数

# awk -F: 'BEGIN{print ARGV[1]}' /etc/passwd /etc/fstab

再次说明, awk 对输入文件中的每一行都执行这个脚本。

自定义变量

1)-v var=value 在选项中定义

示例:自定义变量,打印hello world

# awk -v var='hello world!' 'BEGIN{print var}'

2)在program中直接定义

数组

关联数组:array[index-expression]

index-expression:

1)可以使用任意字符,字符串要使用双引号;

2)如果某数组元素事先不存在,在引用时awk会自动创建此元素并将其值初始化为“空串”;若要判断数组中是否存在某元素,需要使用"index in array"格式进行;

delete array[index]:删除数组中的单个元素

delete array:删除整个数组

函数

内置函数

srand():生成随机数种子

rand():返回1和0之间的随机数(小数)

int():对数取整

length():返回指定字符串的长度

sub(r, s, [t]):以r表示的模式来查找t所表示的字符串所匹配的内容,并将其第一次出现的替换为s所指定的内容

gsub(r, s, [t]):以r表示的模式来查找t所表示的字符串所匹配的内容,并将其所有出现的替换为s所指定的内容

split(s, a, [r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中

自定义函数

function name ( parameter, parameter, ... ) {
statements
return expression
}

awk中的操作符

算术操作符:

  • +  -  *  /  ^  %
  • -x:整数转换为负数
  • +x:字符串转换为数值

赋值操作符:

  • =  +=   -=   /=   %=   ^=   ++   --

比较操作符:

  • >  <  >=  <=  !=  ==

模式匹配符:

  • ~:左侧的字符串是否能够被右侧的模式匹配
  • !~:左侧的字符串是否能够被右侧的模式不匹配

逻辑操作符:

  • && (并且)
  • ||    (或者)
  • !       (否)

文本处理三剑客之awk的更多相关文章

  1. 文本处理三剑客之 awk

    GAWK:报告生成器,格式化文本输出 awk [options] ‘program’ var=value file… awk [options] -f programfile var=value fi ...

  2. 文本处理三剑客之AWK的用法

    1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...

  3. 文本处理三剑客之awk(No.1)

    示例1:只查看test.txt文件内的第3到第7行的内容 awk '{if(NR>=3 && NR<=7) print $0}' test.txt #其中的$0是输出整个行 ...

  4. shell脚本之正则表达和文本处理(文本处理三剑客:1、grep 2、sed 3、awk)

    文本处理三剑客:1.grep  2.sed  3.awk 一.grep:(过滤) grep的使用,主要的参数有: -n  :显示行号:-o  :只显示匹配的内容-q  :静默模式,没有任何输出,得用e ...

  5. Linux实战教学笔记18:linux三剑客之awk精讲

    Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...

  6. 文本处理三剑客之 Sed ——一般编辑命令

    sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...

  7. 文本处理三剑客之 grep

    grep简介 grep(Global search REgular expression and Print out the line)是Linux上的文本处理三剑客之一,另外两个是sed和awk. ...

  8. (转)不看绝对后悔的Linux三剑客之awk实战精讲

    原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...

  9. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

随机推荐

  1. ConfigParser读取配置文件时报错:ConfigParser.MissingSectionHeaderError

    使用ConfigParser来读取配置文件,经常会发现经过记事本.notepad++修改后的配置文件读取时出现下面的问题: ConfigParser.MissingSectionHeaderError ...

  2. xposed 泛型参数怎么设置

    以下是hook一个方法,A(List<class>,bool b); 百度查了好多都没能解决,自己琢磨了挺久才搞定.直接用List.class就可以了,因为重载不能相同参数,所以List就 ...

  3. 数组和集合转化 array与list

    package com.chen.test; import java.io.Serializable;import java.util.Arrays;import java.util.List;imp ...

  4. 算法之暴力破解和kmp算法 判断A字符串是否包含B字符串

    我们都知道java中有封装好的方法,用来比较A字符串是否包含B字符串 如下代码,contains,用法是 str1.contains(str2), 这个布尔型返回,存在返回true,不存在返回fals ...

  5. 标准库类型之map

    使用map得包含map类所在的头文件#include <map> 定义一个map对象:map<string, int> mapTest;//用string作为索引,存储int对 ...

  6. Cairo

    Cairo 英[ˈkaɪrəʊ] 美[ˈkaɪroʊ] n. 开罗(埃及首都); [例句]From Cairo came expressions of regret at the attac

  7. CSS3媒体查询实例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. docker换源

    方案一 修改或新增 /etc/docker/daemon.json # vi /etc/docker/daemon.json { "registry-mirrors": [&quo ...

  9. Android特定语言 Xtendroid

    Xtendroid是一款Android的领域特定语言,它大大降低样板代码,同时提供巨大的工具支持.Xtendroid利用Xtend transpiler实现,它的特点是能够在Java代码编辑或编译期间 ...

  10. python的logging日志模块(一)

    最近修改了项目里的logging相关功能,用到了Python标准库里的logging模块,在此做一些记录.主要是从官方文档和stackoverflow上查询到的一些内容. 官方文档 技术博客 基本用法 ...